我想验证以下是GCC中的错误,而不是我对C++的理解。考虑下面的代码:验证GCC中的错误
struct A
{
struct B
{
template< typename U > U as() const { return U(); }
};
B operator[](int) const { return B(); }
};
template< typename T >
struct as
{
template< typename U >
static T call(const U& u)
{
return u[ 0 ].as<T>(); // accepted by Clang 3.2, rejected by GCC 4.7
// return u[ 0 ].template as<T>(); // does not help and is IMHO not needed
// return u[ 0 ].A::B::as<T>(); // accepted by GCC 4.7
}
};
int main()
{
as<int>::call(A());
}
IMHO代码要细,它是由铛3.2接受,但不是由GCC 4.7(4.4和4.6也失败,基本上是相同的错误,但4.4产生稍微不同的消息) 。下面是从我的壳输出:
$ clang++-3.2 -O3 -Wall -Wextra -std=c++0x t.cc -o t
$ g++-4.7 -O3 -Wall -Wextra -std=c++0x t.cc -o t
t.cc: In static member function ‘static T as<T>::call(const U&)’:
t.cc:17:21: error: invalid use of ‘struct as<T>’
t.cc: In static member function ‘static T as<T>::call(const U&) [with U = A; T = int]’:
t.cc:18:4: warning: control reaches end of non-void function [-Wreturn-type]
$
问:这是海湾合作委员会中的一个bug还是我失去了一些东西?
编辑:我有点困惑:在http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55576的GCC错误报告在评论#9中说,评论#3中的代码是“有效的”。这到底是什么意思?它看起来像海湾合作委员会的人认为它实际上是一个错误,否则他们会已经关闭它? OTOH @Potatoswatter的答案似乎很清楚,它应该是正确的,我应该提交一份针对叮铛的错误报告(或者是否已经有这样的错误报告?)
请注意,我毫不犹豫地将答案标记为接受直到上述内容被澄清。既然这两个答案都已经有帮助(一个解释,一个解决方法),我同时给出了两个答案。
奖金问题:由于我得到了非叙述性代码的低估,我想知道别人的感受。我试图创建一个SCCEE,它消除了所有的干扰并专注于技术问题。这就是我更喜欢考虑这些事情的方式。那是错的吗?
另外,@EdHeal:为什么代码容易发生灾难? (你不认为这是我真实世界的代码,对吗?)
EDIT2:谢谢大卫,刚刚注意到你的编辑。我会将您的答案标记为已接受,并且我还看到您对GCC错误报告发表了评论。我认为这个问题的主要意见从而得到了答复,海湾合作委员会得到了另一个提醒。感谢大家。
我相信这是一个已知的错误。 – Potatoswatter 2013-02-25 10:20:48
但是,由于'u [0]'是一个依赖表达式,所以'template'关键字是必需的。解析器需要能够在不知道'U'的情况下找出'<'符号的含义,并且不需要查找'>'。 – Potatoswatter 2013-02-25 10:23:23
这就是我所想的,Clang应该拒绝这些代码。 – Xeo 2013-02-25 10:25:13