【发布时间】:2014-12-15 10:24:10
【问题描述】:
我有以下 C++ 代码:
//Define to 1 to make it work
#define WORKS 0
#if WORKS
template< typename T > struct Foo;
#else
template< typename T >
struct Foo {
T t;
};
#endif
class Bar; //Incomplete type
void fFooBar(Foo<Bar> const & foobar) { }
void f(Foo<Bar> const & foobar) {
fFooBar(foobar);
}
int main() {
return 0;
}
如果 WORKS 定义为 0(结构模板已定义),则代码无法编译,因为它尝试在 fFooBar(foobar); 实例化它并失败,因为 Bar 不完整。
如果 WORKS 定义为 1(结构模板未定义),则代码编译。
根据标准,不应实例化模板,除非需要完整的类型(const& 不是这种情况)或者它会改变代码的语义(同样不是这种情况,同样,如果模板未定义,也会发生同样的情况。
此外,可以通过从编译单元中删除信息来编译程序,这很奇怪。但是 MSVC、gcc 和 clang 都做同样的事情让我觉得这背后一定有原因。
【问题讨论】:
-
ADL,我想。与stackoverflow.com/questions/25925551/… 类似的问题
-
@T.C. [temp.inst]/7?
-
@T.C.不过,这句话很含糊,在分析中不应该避免吗?
-
@Columbo 我也这么认为,但我的情况正好相反。我的程序在声明模板但未定义时工作。并且在定义时不编译。