【问题标题】:is stateless non-const value usable in a constant expression?无状态非常量值可用于常量表达式吗?
【发布时间】:2019-07-13 15:03:24
【问题描述】:

stackexchange 页面:

https://softwareengineering.stackexchange.com/questions/386602/any-need-for-constexpr-in-tag-values

包含以下语句:

命名空间级变量和静态类变量可以 如果它们本身是,则仅在 constexpr 上下文中使用 constexpr,例外是类和结构 完全是空的。

这意味着,IIUC,以下“stateless-are-constexpr” 声明:

一个完全空的非常量变量 (又名无状态)类型可用于常量 表达。

但是,即使经过认真学习:

7.7 常量表达式[expr.const]

来自:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4800.pdf

我在第 7.7 节中看不到任何地方说或暗示 上面的“stateless-are-constexpr”声明说了什么。它 提到文字值,但没有提到非常量 无状态值。

有人能解释一下上面的语句是怎么回事吗 从 n4800 第 7.7 节或任何其他内容推断 部分说?

请注意,我可以根据以下事实自行推断出 无状态变量只能有一个值,就像 文字 1 只能有一个值,但我无法推断 来自 n4800 第 7.7 节,无需任何帮助。

更具体地说,使用 stackexchange 页面中的代码, n4800怎么说:

struct A {};
A a_global; 
constexpr auto a_cexpr = a_global; 

会编译吗?此外,上述的可编译性 代码显示 a_global 可用于常量表达式? 如果不是,什么是正确的展示方式?

注意,我使用的 2 个编译器可以编译它,但我想要一些 保证它们是正确的。

TIA。

【问题讨论】:

  • 鉴于struct B{ B(const B&){ std::cout << 42; } };B 将不能用作constexpr
  • 感谢 @LightnessRacesinOrbit 提供 basic.types#10 链接。重要的部分是注释,它说不能保证文字“将在常量表达式中使用”。我的结论是,无状态类型是否可用于常量表达式是您使用的编译器的问题。
  • @user1681377 这就是[expr.const] 的用武之地,不是吗?我想也许你错过了“文字类型”的定义。

标签: c++ constants c++17 stateless


【解决方案1】:

您可以将非constexpr 数据的引用传递给constexpr 函数;如果您从不使用引用,则没有问题。

struct A{
  int x=7;
  A()=default;
  A(int in):x(in){}
  constexpr A(A const&) {};
};

A a=rand();
constexpr auto b = a;
int main(){}

您的空类型只会复制 ctor constexpr 而从不读取任何内容。 Copy ctor 不复制任何内容,所以不关心它的输入是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多