[英]Conditional inclusion in C++11 with user-defined literal?
在C ++ 11中,當一個表單的預處理指令...
#if expr
遇到...時, expr
被計算為16.1 [cpp.cond]
描述的constant-expression
。
這是在expr
上的宏替換之后完成的,其標識符(和關鍵字)被替換為0,其preprocessing-tokens
被轉換為tokens
, defined
運算符被評估,等等。
我的問題是當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
被轉換為tokens
,defined
運算符被評估,等等。我的問題是當
expr
中的一個tokens
是user-defined-literal
什么?
該計划格式不正確。
我的觀點的核心是從16.1/1
腳注147
的觀察中收集到的,在翻譯階段4中除了宏名稱之外沒有其他identifiers
。
參數:
根據2.14.8 [lex.ext]/2
user-defined-literal
被視為對literal operator
或literal operator template
的調用(13.5.8)
。
所以在這里,即使在16.1/4
描述的所有替換之后,我們仍然有一個(運算符)函數的剩余調用。 (其他嘗試,例如使用constexpr
函數,將被所有非宏identifiers
替換為0
來阻止。)
由於這發生在翻譯階段4,所以還沒有定義或甚至聲明的功能; 嘗試查找literal-operator-id
必須失敗(參見16.1/1
中的腳注147以獲得類似的參數)。
從略微不同的角度看,我們發現: 5.19/2
:
conditional-expression
是core 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
, #ifndef
或defined
的參數。 例如,假設我從未#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.