有没有办法在调用函数时阻止隐式static_cast?

时间:2014-03-22 15:04:20

标签: c++

C ++ 11添加了这个。

int x;
unsigned int y{ x }; // ERROR

是否可以启用此类内容。

int x;
void f(unsigned int y);
f(x); //ERROR

编译器:VC ++ 2013

2 个答案:

答案 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的-Werrorfor example),但这在C ++ 11中并不新,并且它本身并不禁止转换

The program is only ill-formed if you actually cause a narrowing conversion.同样,这是特定于所涉及的值,并不是关于隐式转换的一般规则。