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

时间:2014-11-04 22:07:11

标签: c++ c++11 language-lawyer inline-functions one-definition-rule

何时表达式包含在标记内联的函数中,可能会评估'?

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能够成功链接。相反,如果声明内联的函数中的表达式只能被评估,那么这些表达式就会被评估为&#39;当这样的函数本身变得使用时,我希望$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin在链接步骤中失败。

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

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

1 个答案:

答案 0 :(得分:7)

§14[temp] / p6:

  

一个函数模板,一个类模板的成员函数,变量   应定义模板或类模板的静态数据成员   在每个隐式实例化的翻译单元中   (14.7.1)除非明确相应的专业化   在某些翻译单元中实例化(14.7.2);没有诊断   必需的。

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