4

當標記包含內嵌認爲是函數內部的表達式「潛在評價」?內聯函數機構和模板成員的實例化潛力評價

a.cpp

template <typename T> 
const T& foo(const T& arg) { return arg; } 

inline void dead() { 
    int x(21); 
    x = foo(x); 
} 

b.cpp

#include <iostream> 

template <typename T> const T& foo(const T&); 

int main(int argc, char *argv[]) { 
    std::cout << foo(12) << std::endl; 
} 

如果表達式被認爲是 '潛在的評價' 只要內聯函數被定義,則該模板應被實例化,我希望$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin成功鏈接。如果一個函數內部的表達式在內聯的時候只會變成'可能被計算出來',當這個函數本身變成odr時,那麼我認爲$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin在鏈接步驟失敗。

至此我已測試XL C++ 12(其成功鏈接),和gcc +鐺3.5的各種版本(所有這些失敗鏈接)。

哪種行爲正確?我錯過了第三個選項嗎?

+1

@hvd對不起,我的模板問題的肌肉記憶踢。 – user657267 2014-11-04 22:25:03

+0

'死()'甚至不必須是內聯。優化還可以從編譯器輸出中刪除模板的所有痕跡。 – 2014-11-04 22:36:06

回答

7

§14[溫度]/P6:

函數模板,類模板,可變 模板或模板類的靜態數據成員的成員函數將被定義在每一個轉換單元 在它被隱含地實例化了,除非相應的專門化在某些翻譯單元中實例化(14.7.2),否則明確地 ;沒有診斷需要 。

你的代碼是形成不良的,沒有診斷需要。兩個編譯器的行爲都是正確的。

相關問題