如何以自然方式使const右值?
这是一个简单的例子:
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?
答案 0 :(得分:4)
这里的问题是A{}
并没有给您const A
,它只是给了您A
,因此2被调用,因为它可以在非常量值上调用。
如果要调用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
右值。
答案 1 :(得分:2)
问题是,如何使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, "!" );
}
答案 2 :(得分:2)
也许这就是您想要的?
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());
}