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

时间:2019-02-20 01:46:37

标签: c++ const c++17 stateless

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。

1 个答案:

答案 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不复制任何内容,因此不在乎其输入是什么。