【发布时间】: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