右值限定方法和const表达式

时间:2018-11-26 22:22:33

标签: c++ c++11 c++17 constexpr

如何以自然方式使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?

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());
}