内联函数体的潜在评估和模板成员的实例化

shr*_*ght 4 c++ one-definition-rule inline-functions language-lawyer c++11

何时表达式包含在标记为内联的函数内,被认为是"潜在评估"?

a.cpp

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

inline void dead() {
    int x(21);
    x = foo(x);
}
Run Code Online (Sandbox Code Playgroud)

b.cpp

#include <iostream>

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

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

如果在定义内联函数时将表达式视为"可能已评估",则应该实例化模板,并且我希望$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin成功链接.相反,如果这样的函数本身变得使用了,那么在内联声明的函数中的表达式只会变为"可能被评估",那么我希望$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin在链接步骤中失败.

到目前为止,我已经测试了xl C++ 12(成功链接)和各种版本的gcc + clang 3.5(所有这些都无法链接).

哪种行为是正确的?我在这里错过了第三种选择吗?

T.C*_*.C. 7

§14[temp]/p6:

函数模板,类模板的成员函数,变量模板或类模板的静态数据成员应在每个隐式实例化的转换单元中定义(14.7.1),除非明确实例化相应的特化(14.7. 2)在一些翻译单位; 无需诊断.

您的代码格式错误,无需诊断.两个编译器都表现正常.