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的各種版本(所有這些失敗鏈接)。
哪種行爲正確?我錯過了第三個選項嗎?
@hvd對不起,我的模板問題的肌肉記憶踢。 – user657267 2014-11-04 22:25:03
'死()'甚至不必須是內聯。優化還可以從編譯器輸出中刪除模板的所有痕跡。 – 2014-11-04 22:36:06