簡體   English   中英

使用用戶定義的文字在C ++ 11中有條件地包含?

[英]Conditional inclusion in C++11 with user-defined literal?

在C ++ 11中,當一個表單的預處理指令...

#if expr

遇到...時, expr被計算為16.1 [cpp.cond]描述的constant-expression

這是在expr上的宏替換之后完成的,其標識符(和關鍵字)被替換為0,其preprocessing-tokens被轉換為tokensdefined運算符被評估,等等。

我的問題是當expr中的一個標記是user-defined-literal什么?

用戶定義的文字就像函數調用,但函數調用不能在expr發生(我認為),作為標識符替換的副作用。 然而,技術上user-defined-literals可以存活。

我懷疑這是一個錯誤,但我不明白如何從標准中得出結論?

也許忽略了在第16條[cpp]上添加用戶定義文字的(迂腐)影響?

或者我錯過了什么?

更新:

通過一個例子澄清:

這預處理到什么:

#if 123_foo + 5.5 > 100
bar
#else
baz
#endif

吧或巴茲還是錯誤的?

GCC 4.7報告:

test.cpp:1:5: error: user-defined literal in preprocessor expression

所以它認為這是一個錯誤。 這可以參考標准來證明嗎? 或者這只是“隱含的”?

在C ++ 11中,當遇到形式為... #if expr ...的預處理指令時, expr被計算為一個constant-expression ,如16.1 [cpp.cond]

這是在expr上的宏替換之后完成的,其標識符(和關鍵字)被替換為0 ,其preprocessing-tokens被轉換為tokensdefined運算符被評估,等等。

我的問題是當expr中的一個tokensuser-defined-literal什么?

該計划格式不正確。

我的觀點的核心是從16.1/1腳注147的觀察中收集到的,在翻譯階段4中除了宏名稱之外沒有其他identifiers

參數:

根據2.14.8 [lex.ext]/2

user-defined-literal被視為對literal operatorliteral operator template的調用(13.5.8)

所以在這里,即使在16.1/4描述的所有替換之后,我們仍然有一個(運算符)函數的剩余調用。 (其他嘗試,例如使用constexpr函數,將被所有非宏identifiers替換為0來阻止。)

由於這發生在翻譯階段4,所以還沒有定義或甚至聲明的功能; 嘗試查找literal-operator-id必須失敗(參見16.1/1中的腳注147以獲得類似的參數)。

從略微不同的角度看,我們發現: 5.19/2

conditional-expressioncore constant expression除非它涉及以下之一作為潛在評估的子表達式(3.2)[...]:

  • [...]
  • 調用除了文字類或constexpr函數的constexpr構造函數之外的函數;
  • 調用未定義的constexpr函數或未定義的constexpr構造函數[...];

由此,在constant expression使用user-defined literal需要定義的 constexpr literal operator ,該literal operator在轉換階段4中也不可用。

gcc拒絕這一點是對的。

在C ++ 11中,當遇到#ifdef expr形式的預處理指令時, expr被評估為16.1所述的常量表達式。 這是在expr上的宏替換之后完成的,其標識符(和關鍵字)被替換為0,其預處理標記被轉換為標記,定義的運算符被評估,等等。

沒有!

計算#ifdef#ifndefdefined的參數。 例如,假設我從未#define預處理器符號SYMBOL_THAT_IS_NEVER_DEFINED 這完全有效:

#ifdef SYMBOL_THAT_IS_NEVER_DEFINED
code
#endif

擴展未定義符號的符號是非法的。 假設尚未定義SYMBOL_THAT_IS_NEVER_DEFINED這是非法的:

#if SYMBOL_THAT_IS_NEVER_DEFINED
code
#endif

類似於在解除引用之前檢查指針是否為非空,在使用之前檢查符號是否合法是合法的:

#if (defined SYMBOL_THAT_MIGHT_BE_DEFINED) && SYMBOL_THAT_MIGHT_BE_DEFINED
code
#endif

暫無
暫無

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

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