内联函数体的潜在评估和模板成员的实例化
Potential evaluation of inline function bodies and instantiation of template members
标记为内联的函数中包含的表达式何时被视为"潜在求值"?
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);没有诊断必需。
您的代码格式不正确,不需要进行诊断。两个编译器都运行正常。
相关文章:
- 静态数据成员模板专用化的实例化点在哪里
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 受约束的成员函数和显式模板实例化
- 实例化多种类型的成员函数模板
- 为什么在使用指针时不采用类成员的默认值,而不是直接实例化对象时?
- 将类成员函数的模板定义放在 CPP 文件中C++隐式实例化而不是 .H 允许吗?
- 如何实例化类的公共成员并将其作为 std::p romise 返回?
- 在实例化封闭类模板之后,我们可以声明模板类成员的部分专用化吗
- 使用 SFINAE 有选择地实例化模板的成员函数
- 静态模板成员函数的实例化?
- 访问使用接口实例化的类的私有成员
- Google Mock:在目标类的构造函数中实例化的模拟私有变量成员
- 参考数据成员到模板的实例化
- 类的私有成员在我的类实例化期间更改,即使他们不应该
- 如果未实例化成员模板,是否要评估static_asserts?
- 实例化与unique_ptr的类集合成员
- 实例化成员模板函数时的Buggy(?)编译器行为
- 使用向量<向量>成员实例化对象时的隔离错误<int>
- 静态成员与静态常量成员实例化 - 有什么区别?
- 显式类成员实例化