c++ - 无状态非常量值可用于常量表达式吗?

标签 c++ constants c++17 stateless

堆栈交换页面:

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/

相关文章:

angularjs - 增量添加到 Angular JS 中的现有变量

c++ - 模板成员的别名声明

c++ - 如何最好地测试和解包std::if语句中的可选

c++ - 在 unsigned char 数组中设置 unsigned short

c++ - 获取 2 个 QDir 的共同父级

c++ - 可变类模板的循环模板依赖

c++ - 可以接受未知签名的可变函数引用的类

class - 创建一个不可实例化、不可扩展的类

c++ - 为什么非常量引用不能绑定(bind)到临时对象?

c++ - 类模板的 C++1 7's "模板参数推导可以推导局部类型吗?