4

何时将标记为 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链接成功。相反,如果声明为 inline 的函数中的表达式仅在此类函数本身变为 odr-used 时才变为“潜在评估”,那么我预计$(CCC) -c a.cpp; $(CCC) -c b.cpp; $(CCC) a.o b.o -o bin在链接步骤期间会失败。

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

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

4

1 回答 1

7

§14 [温度]/p6:

函数模板、类模板的成员函数、变量模板或类模板的静态数据成员应在隐式实例化 (14.7.1) 的每个翻译单元中定义,除非相应的特化被显式实例化 (14.7. 2) 在某些翻译单元中;不需要诊断。

您的代码格式错误,无需诊断。两个编译器的行为都正确。

于 2014-11-04T22:32:36.437 回答