堆栈交换页面:
https://softwareengineering.stackexchange.com/questions/386602/any-need-for-constexpr-in-tag-values
包含以下语句:
Namespace-level variables and static class variables can only be used in a constexpr context if they themselves are constexpr, the exception being classes and structs that are entirely empty.
这意味着,IIUC,以下“stateless-are-constexpr” 声明:
a non-const variable of an entirely empty (a.k.a. stateless) type is usable in a constant expression.
然而,即使在认真学习之后:
7.7 Constant expressions [expr.const]
来自:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4800.pdf
我在第 7.7 节中看不到任何地方说或暗示 上面的“stateless-are-constexpr”声明说的是什么。它 提到文字值但没有提到非常量 无状态值。
谁能解释一下上面的语句是怎么来的 从 n4800 的第 7.7 节或任何其他 部分说?
请注意,我自己可以从以下事实中合乎逻辑地推断出 无状态变量只能有一个值,就像 literal,1,只能有一个值,但我无法推断 来自 n4800 第 7.7 节,没有任何帮助。
更具体地说,使用来自 stackexchange 页面的代码, n4800 是怎么说的:
struct A {};
A a_global;
constexpr auto a_cexpr = a_global;
会编译吗?此外,上述的可编译性 代码显示 a_global 可用于常量表达式? 如果不是,显示它的正确方法是什么?
请注意,我用过的 2 个编译器都可以编译它,但我想要一些 保证它们是正确的。
TIA。
最佳答案
您可以将对非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(){}
您的空类型只是制作复制构造函数 constexpr 并且从不读取任何内容。 Copy ctor 不复制任何内容,所以不关心它的输入是什么。
关于c++ - 无状态非常量值可用于常量表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54777607/