C++ 调用函数时是否有方法防止隐式静态_强制转换?
C++11添加了这一点C++ 调用函数时是否有方法防止隐式静态_强制转换?,c++,C++,C++11添加了这一点 int x; unsigned int y{ x }; // ERROR 是否有可能启用类似的功能 int x; void f(unsigned int y); f(x); //ERROR 编译器:VC++2013试试这个(): 模板< 类型名T, typename=typename std::enable_if::type > 空位f(tx){} 否,没有编译器开关或其他常规设置来执行此操作。隐式转换是语言的一部分,在内置类型的一般情况下不能禁用。最接近的方法是用户
int x;
unsigned int y{ x }; // ERROR
是否有可能启用类似的功能
int x;
void f(unsigned int y);
f(x); //ERROR
编译器:VC++2013试试这个():
模板<
类型名T,
typename=typename std::enable_if::type
>
空位f(tx){}
否,没有编译器开关或其他常规设置来执行此操作。隐式转换是语言的一部分,在内置类型的一般情况下不能禁用。最接近的方法是用户定义的包装类,它只有显式的构造函数,或者对试图调用的函数应用一些模板元黑客(如中所示)
您问题的前提似乎将隐式转换与缩小转换的特例混为一谈。以下是:
int x = 0;
unsigned int y{ x };
这不是一个错误。您,并且此警告可能会变成错误(使用GCC的-Werror
),但这在C++11中不是新的,并且它本身并不禁止转换
同样,这是特定于所涉及的值的,不是隐式转换的一般规则。您遇到了错误,或者希望编译器给出错误?@pranitkothari,我希望编译器给出错误或警告。不要尝试更改编译器的行为(因为这可能不容易实现)。您需要自己处理代码。是否愿意执行f({x})
?您的问题文本当前不反映您的标题问题。。。显然你只想禁止缩小转换范围。我没有投反对票,但我认为OP的作者想要更多的编译器开关来禁止隐式强制转换。我收回了我的反对票,因为你的回答是正确的。这是否是一个答案还不能确定。
int x = 0;
unsigned int y{ x };