【发布时间】:2011-12-15 09:17:23
【问题描述】:
我有一个问题困扰了我几个小时。
最初我认为类型在实例化点必须是完整的,但我尝试过的所有编译器都接受该类型在该点仍然不完整,只要它被定义翻译单元中的任何位置。
为了说明这一点,问题是关于这个简单程序的正确性:
template <typename T>
int size() {
return sizeof(T); // T is required to be complete in this expression
}
class test; // test is declared, but incomplete
int main() {
size<test>();
}
// [1] point of instantiation of size<test>()
class test {}; // Definition of test, now it is complete
根据 §14.6.4.1/1,size<test> 的实例化点是标记为 [1] 的行,此时 test 类型仍然不完整。如果我们尝试在那里执行sizeof(test) 操作,编译器将无法告诉我们类型不完整。然而调用一个模板,其中执行相同操作的类型在 g++、clang++、comeau 和 Visual Studio 2010 中编译。
前面的代码真的正确吗?如果在同一翻译单元中的任何位置complete,它在标准中的哪个位置支持将用作模板参数的类型视为complete?或者当必须完成?
【问题讨论】:
-
@aschepler:我相信它们是完全一样的,唯一的区别是我投票结束。我不会(还)删除它以 bump 你的问题,看看是否有人提出了答案(你的问题的唯一答案有点偏离)。感谢您指出重复。
-
@aschepler:绝对是重复的,但是这个问题似乎越来越受到关注(生活是不公平的)。我真的很希望我们的标准制定者能来这里。