调用构造函数时,你有多明确?

P45*_*ent 11 c++ c++11

我有这门课

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)上,它编译并运行值xy包含在无符号类型中.我没想到这一点,但由于类型不匹配而期待编译错误.

我错过了什么?

Bat*_*eba 7

你运气不好,标准允许通过为常量引用传递的参数创建匿名临时值,将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同一雇主的做法是提供给你的最佳方法.