是一个在常量表达式中可用的无状态非const值吗?

问题描述 投票:2回答:1

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。

c++ const c++17 stateless
1个回答
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什么都不复制,所以不关心它的输入是什么。

© www.soinside.com 2019 - 2024. All rights reserved.