簡體   English   中英

常量表達式中可以使用無狀態非常量值嗎?

[英]is stateless non-const value usable in a constant expression?

stackexchange頁面:

https://softwareengineering.stackexchange.com/questions/386602/any-need-for-constexpr-in-tag-values

包含以下語句:

如果命名空間級變量和靜態類變量本身是constexpr,則只能在constexpr上下文中使用,但例外是完全為空的類和結構。

IIUC表示以下“ stateless-are-constexpr”語句:

在常量表達式中可以使用完全為空(即無狀態)類型的非常量變量。

但是,即使經過認真研究:

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。

您可以constexprconstexpr數據的引用傳遞給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不復制任何內容,因此不在乎其輸入是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM