2016-12-27 59 views
2

pfultz2所示,對於lambda函數的靜態初始化有一個解決方法。其中一個步驟提到解除引用lambda函數類型的指針的nullptr。是否將nullptr解析爲lambda函數未定義的行爲?

template <typename T> typename std::remove_reference <T>::type * addr (T && t) 
{ 
    return & t; 
} 

constexpr auto f = true ? nullptr : addr ([] (int arg) { return arg + 1; }); 

int main() 
{ 
    assert (((*f) (1) == 2)); 
} 

經歷的規範,另一個問題C/C++ nullptr dereference我聽不太懂*f是未定義的行爲或不。規範中的哪些部分會使此不是未定義的行爲?

回答

3

規範中的哪些部分會使這種不確定的行爲?

這是一個錯誤的問題。沒有一個程序的標準的一部分明確表示它是未定義的,標準的另一部分說它是無論如何定義的。

您鏈接到的問題是關於採取解除引用的空指針的地址。這不是你在這裏做的。你在這裏做的是通過一個空指針調用成員函數。 (*f) (1)表示f->operator() (1)。這是明確無效的,如果-fsanitize=undefined選項會在運行時與GCC或叮噹失敗,否則可能會導致不可預知的行爲,因爲優化程序假設爲f != null

從N4140(大致C++ 14)報價,但它是在標準的其它版本不不同:

9.3.1非靜態成員函數[class.mfct.non靜電]

2如果爲非X類型的對象或類型爲X的對象調用類X的非靜態成員函數,則行爲未定義。

+0

謝謝,現在看起來很明顯,當你指出它。我迷失在隱式轉換中,誰知道什麼! – listcrawler

相關問題