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

Potential evaluation of inline function bodies and instantiation of template members

本文关键字:成员 实例化 函数体 评估      更新时间:2023-10-16

标记为内联的函数中包含的表达式何时被视为"潜在求值"?

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:

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

您的代码格式不正确,不需要进行诊断。两个编译器都运行正常。