C ++ 11添加了这个。
int x;
unsigned int y{ x }; // ERROR
是否可以启用此类内容。
int x;
void f(unsigned int y);
f(x); //ERROR
编译器:VC ++ 2013
答案 0 :(得分:0)
试试这个(live example):
template <
typename T,
typename = typename std::enable_if <std::is_same <T, unsigned int>{}>::type
>
void f(T x) { }
答案 1 :(得分:0)
不,没有编译器开关或其他常规设置来做到这一点。隐式转换是语言的一部分,在内置类型的一般情况下无法禁用。您可以获得的最接近的是一个用户定义的包装器类,它只包含explicit
个构造函数,或者将一些模板元hackery应用于您尝试调用的函数(如iavr's answer中所示)。
您的问题的前提似乎是将隐式转化与缩小转化的特殊情况混为一谈。以下内容:
int x = 0;
unsigned int y{ x };
不错误。您may get a warning about the potential narrowing conversion,此警告可能会变成错误(使用GCC的-Werror
,for example),但这在C ++ 11中并不新,并且它本身并不禁止转换
The program is only ill-formed if you actually cause a narrowing conversion.同样,这是特定于所涉及的值,并不是关于隐式转换的一般规则。