标记为 inline 的函数中包含的表达式何时被视为“潜在评估”?
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 + clang 3.5(所有这些都无法链接)。
哪种行为是正确的?我在这里错过了第三个选择吗?
最佳答案
§14 [温度]/p6:
您的代码格式错误,无需诊断。两个编译器都运行正常。
关于c++ - 内联函数体的潜在评估和模板成员的实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26745973/