stackexchange页面:
https://softwareengineering.stackexchange.com/questions/386602/any-need-for-constexpr-in-tag-values
包含以下语句:
命名空间级别的变量和静态类变量可以 仅在constexpr上下文中使用,如果它们本身是 constexpr,例外是类和结构 完全是空的。
表示IIUC,以下“无状态是常量表达式” 声明:
一个完全为空的非常量变量 (也称为无状态)类型可以在常量中使用 表达。
但是,即使经过认真研究:
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。
答案 0 :(得分:0)
您可以将对非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,而不会读取任何内容。复制ctor不复制任何内容,因此不在乎其输入是什么。