模板参数类型通过转换操作员扣除
Template argument type deduction by conversion operator
我在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。这是为什么?是某种扩展吗?
由 CWG问题#349 覆盖,由EDG C 前端的开发人员打开(显然是DEWUC int
,而不是const int
):
我们遇到了有关资格转换的问题 转换功能的模板参数扣除。
问题是:转换功能中T的类型是什么 通过此示例打电话?t" int"或" const int"?
如果t是" int",则A类作品中的转换功能,而在 B级失败(因为返回表达式无法转换为 函数的返回类型)。如果t是" const int",则a失败和b 作品。
因为资格转换是根据 转换功能,我认为将t推断为const int。
没有好处此外,我认为A类中的代码比 如果班级的作者正在计划 将指针返回到const实体,我希望该功能 已在返回类型中使用const编写。
因此,我相信正确的结果应该是t。
struct A { template <class T> operator T***() { int*** p = 0; return p; } }; struct B { template <class T> operator T***() { const int*** p = 0; return p; } }; int main() { A a; const int * const * const * p1 = a; B b; const int * const * const * p2 = b; }
我们刚刚实施了此功能,并在委员会的澄清中进行了澄清,我们将t推定为int。 G 和Sun编译器似乎将T推论为const int。
这仅使引用的段落成立(C 03!),并且大概被编译器开发人员忽略了。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- 尝试制作类型转换操作员
- 使用用户定义的转换操作员隐式转换
- 是否可以使用明确的模板参数调用模板的用户定义转换操作员
- 为什么返回Sfinae转换操作员不起作用
- C 如何将对象数据传递到用户定义的转换操作员中
- 为什么C 标准要求编译器忽略对基本类型转换操作员的呼叫
- C 三元操作员的转换理解
- C 操作员在具有构造函数转换时过载
- 使用位操作员将十进制转换为八十位
- 转换操作员 转换构造函数=不直觉的行为
- 调用转换操作员
- 模板参数类型通过转换操作员扣除
- STD ::向量有转换操作员吗?我看到了什么
- 将操作员==在C 中转换为Objective-C
- 操作员重载内部调用转换
- std::使用虚拟呼叫操作员转换抛出"global functions do not have 'this' pointers"