我怎样才能以自然的方式创造价值呢?
下面是一个简单的例子:
struct A {
void f() &&{} // 1
constexpr bool f() const &{return true;} // 2
constexpr bool f() const &&{return true;} // 3 really usefull?
};
int main() {
static_assert(A{}.f()); // does not compile because call 1 instead of 3
constexpr A a;
static_assert(a.f());
}为什么第一个static_assert()调用1而不是3?
发布于 2018-11-26 22:30:12
这里的问题是,A{}不给您一个const A,它只是给您一个A,所以2会被调用,因为它是可以在非const值上调用的。
如果您希望调用4,则需要创建一个const A,并且可以使用别名声明来实现这一点。如果您有using A_const = const A;,那么A_const{}将给您一个const A,A_const{}.f()将调用4而不是2。
本质上,它所做的是static_assert(const A{}.f());,但是由于语法上不能这样编写它,我们需要使用声明来给出一个单词类型,即const A。
此外,您还可以重写
static_assert(A{}.f());作为
static_assert(std::add_const_t<A>{}.f());并得到一个const A rvalue。
发布于 2018-11-26 22:35:24
问题是,如何使rvalue对象在const表达式上工作?
另一种方法是通过constexpr函数返回A const
#include <iostream>
struct A
{
std::size_t f() & { return 1u; }
std::size_t f() && { return 2u; }
constexpr std::size_t f() const & {return 3u; }
constexpr std::size_t f() const && {return 4u; }
};
constexpr A const foo ()
{ return {}; }
int main()
{
static_assert( foo().f() == 4u, "!" );
}发布于 2018-11-26 22:38:53
也许这能做你想要的?
struct A {
constexpr bool f() &&{return true;} // 1
constexpr bool f() const &{return true;} // 2
constexpr bool f() const &&{return true;} // 3 really usefull?
};
int main() {
static_assert(A{}.f()); // does not compile because call 1 instead of 3
constexpr A a;
static_assert(a.f());
}https://stackoverflow.com/questions/53490019
复制相似问题