c – 显式转换运算符模板的优先级和模糊性
发布时间:2020-12-16 06:54:14 所属栏目:百科 来源:网络整理
导读:我一直在我的项目中使用模板化的显式转换运算符,以实现类似自定义变体类型的显式转换.再现我的问题的最小示例如下所示(在C 14模式下): #include iostream#include stdexcept#include cmathusing namespace std;class A{ public: templatetypename T explici
我一直在我的项目中使用模板化的显式转换运算符,以实现类似自定义变体类型的显式转换.再现我的问题的最小示例如下所示(在C 14模式下):
#include <iostream> #include <stdexcept> #include <cmath> using namespace std; class A { public: template<typename T> explicit operator T() const // 1 { cout << "operator T" << endl; return T(); } template<typename T> explicit operator const T&() const // 2 { cout << "operator const T&" << endl; throw runtime_error("operator const T&"); } template<typename T> explicit operator T&() // 3 { cout << "operator T&" << endl; throw runtime_error("operator T&"); } }; int main(int,char**) { try { const A& a = A(); cout << abs(static_cast<double>(a) - 3.14) << endl; } catch (const runtime_error&) { } return 0; } 我遇到的问题是为static_cast转换选择的运算符.对于海湾合作委员会来说,这是一种预期的(1)案例.输出是: operator T 3.14 但Clang拒绝使用以下输出编译它: main.cpp:37:20: error: ambiguous conversion for static_cast from 'const A' to 'double' cout << std::abs(static_cast<double>(a) - 3.14) << endl; ^~~~~~~~~~~~~~~~~~~~~~ main.cpp:10:32: note: candidate function [with T = double] template<typename T> explicit operator T() const ^ main.cpp:16:32: note: candidate function [with T = double] template<typename T> explicit operator const T&() const ^ 1 error generated. 为什么Clang考虑转换(2),当它显然需要在转换序列中进行额外的构造函数调用时,而(1)不会?它是否正确(而GCC是错误的)这样做? 解决方法
static_cast执行隐式转换或直接初始化.在你的情况下,隐式转换是不可行的,但直接初始化是因为static_cast考虑
explicit constructors and conversion functions.所以我的猜测是clang(在我看来正确)确定有两种可能的直接初始化和抱怨.不知道GCC内部发生了什么,也许它默认为操作符T(),如果它可以找到一个,无论是否存在其他的.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |