【发布时间】:2015-02-27 01:50:40
【问题描述】:
我注意到 gcc 5.0 拒绝以下代码,而 clang 3.6 接受它。
template<int n>
struct I
{
typedef int Type;
};
template<typename T>
struct A
{
typedef I<sizeof(sizeof(T))>::Type Type;
};
这两个编译器似乎在sizeof(sizeof(T)) 是依赖于类型还是依赖于值的表达式方面存在差异。如果表达式是依赖的,那么I<sizeof(sizeof(T))> 是依赖类型,这意味着应该需要typename。
C++11 标准中的以下措辞涵盖了这一点:
[temp.dep.type]/8
一个类型是依赖的,如果它是
- 一个简单模板ID,其中模板名称是模板参数或任何模板 arguments 是依赖类型或依赖于类型或值的表达式
[temp.dep.expr]/4
以下形式的表达式从不依赖于类型(因为表达式的类型不能 依赖):
sizeof unary-expression sizeof ( type-id )[temp.dep.constexpr]/2
如果一元表达式或表达式是类型相关的,则以下形式的表达式是值相关的 或者 type-id 是依赖的:
sizeof unary-expression sizeof ( type-id )
我的解释是sizeof(T) 永远不能依赖于类型,这意味着sizeof(sizeof(T)) 永远不能依赖于类型或值。
这是 gcc 中的错误吗?
【问题讨论】:
-
哦。 GCC 还认为
sizeof n是依赖的。 melpon.org/wandbox/permlink/BLobLBzkQXNRfDuq -
嗯,
sizeof n不依赖于类型,而是依赖于值。sizeof X,其中Xnot 类型相关根本不相关。因此,sizeof sizeof n必须是独立的,不是吗? -
有趣的是,在 gcc 4.7.2 上编译,但在 4.9.0 上失败。
-
@dyp 好点,我已经更改了示例..
-
@willj 这有什么改变?
sizeof( type-id )仍然不依赖于类型。
标签: c++ templates language-lawyer dependent-type compiler-bug