stackexchange页面:
https://softwareengineering.stackexchange.com/questions/386602/any-need-for-constexpr-in-tag-values
包含以下声明:
命名空间级变量和静态类变量只能在constexpr上下文中使用,如果它们本身是constexpr,则异常是完全为空的类和结构。
这意味着,IIUC,以下“无国籍是constexpr”声明:
完全空(a.k.a.无状态)类型的非const变量可用于常量表达式。
然而,即使经过认真研究:
7.7常量表达式[expr.const]
从:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4800.pdf
我在第7.7节中没有看到任何地方说明或暗示上述“无国籍是constexpr”声明所说的内容。它提到了字面值,但没有提到非const无状态值。
有人可以解释一下如何从n4800第7.7节或任何其他部分所说的内容推断出上述陈述?
注意,我可以从逻辑上推断出一个无状态变量只能有一个值的事实,就像文字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(){}
你的空类型只是复制ctor constexpr并且永远不会读取任何东西。复制ctor什么都不复制,所以不关心它的输入是什么。