【发布时间】:2015-07-22 05:52:06
【问题描述】:
我看到了来自 C++ 11 标准 (n3337, 14.8.2.3/7) 的示例
struct A {
template <class T> operator T***();
};
A a;
const int * const * const * p1 = a; // T is deduced as int, not const int
并尝试通过不同的编译器重现它。我通过在转换函数中添加类型为 T 的声明对示例进行了一些更改
struct A {
template <class T> operator T***()
{
T t; //if T==const int, then it is error (uninitialized const)
return nullptr;
}
};
A a;
const int * const * const * p1 = a;
int main(){}
所有编译器(VS2014、gcc 5.1.0 和 clang 3.5.1)在声明“t”时都会出错,这意味着 T 被推导出为 const int。这是为什么?是扩展名吗?
【问题讨论】:
-
恭喜,您发现了一个编译器错误。 (这不是一个符合标准的扩展;它拒绝根据标准格式正确的代码。)
-
@T.C.就reported吧。太糟糕了 bugzilla 不允许你 ninja-edit 提交!
-
太棒了。多达 3 个编译器具有相同的错误 :) icc 13.0.1 编译器正常
-
@user3514538 正如我在回答中提到的,EDG 的开发人员提交了缺陷报告。英特尔编译器采用 EDG 前端;这就解释了为什么它是这里唯一符合要求的实现。
标签: c++ templates c++11 operator-overloading type-deduction