我有这门课
struct foo
{
explicit foo(const std::uint32_t& x, const std::uint32_t& y);
};
Run Code Online (Sandbox Code Playgroud)
和方法
int main()
{
std::int32_t x = -1;
std::int32_t y = -1;
foo f(x, y);
}
Run Code Online (Sandbox Code Playgroud)
在我的编译器(MSVC2012)上,它编译并运行值x
并y
包含在无符号类型中.我没想到这一点,但由于类型不匹配而期待编译错误.
我错过了什么?
你运气不好,标准允许通过为常量引用传递的参数创建匿名临时值,将signed转换为unsigned.
(注意,对于非常量引用,情况并非如此).
如果您正在使用C++ 11,最好的办法是使用删除构造函数
foo(const std::int32_t& x, const std::int32_t& y) = delete;
Run Code Online (Sandbox Code Playgroud)
在C++ 11之前,你可以制作这个构造函数private
而不是定义它.更像是老式的不可复制的习语.
MSVC2012是一种中途的C++ 03/C++ 11编译器.它实现了一些C++ 11功能,但没有实现其他功能.不幸的是构造的缺失是它的特点之一不支持这样的private
同一雇主的做法是提供给你的最佳方法.
归档时间: |
|
查看次数: |
263 次 |
最近记录: |