首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R值限定方法及const表达式

R值限定方法及const表达式
EN

Stack Overflow用户
提问于 2018-11-26 22:22:33
回答 3查看 110关注 0票数 0

我怎样才能以自然的方式创造价值呢?

下面是一个简单的例子:

代码语言:javascript
复制
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?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-26 22:30:12

这里的问题是,A{}不给您一个const A,它只是给您一个A,所以2会被调用,因为它是可以在非const值上调用的。

如果您希望调用4,则需要创建一个const A,并且可以使用别名声明来实现这一点。如果您有using A_const = const A;,那么A_const{}将给您一个const AA_const{}.f()将调用4而不是2。

本质上,它所做的是static_assert(const A{}.f());,但是由于语法上不能这样编写它,我们需要使用声明来给出一个单词类型,即const A

此外,您还可以重写

代码语言:javascript
复制
static_assert(A{}.f());

作为

代码语言:javascript
复制
static_assert(std::add_const_t<A>{}.f());

并得到一个const A rvalue。

票数 4
EN

Stack Overflow用户

发布于 2018-11-26 22:35:24

问题是,如何使rvalue对象在const表达式上工作?

另一种方法是通过constexpr函数返回A const

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2018-11-26 22:38:53

也许这能做你想要的?

代码语言:javascript
复制
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());
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53490019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档