一个构造函数有多个参数时,是否需要使用explicit关键字?

8

本问题涉及C++11(C++03)的先前标准。 explicit 防止从一种类型到另一种类型的隐式转换。例如:

struct Foo
{
    explicit Foo(int);
};

Foo f = 5; // will not compile
Foo b = Foo(5); // works

如果我们有一个构造函数需要两个或更多参数,explicit 会防止什么?我知道在C++11中你可以使用花括号初始化,所以它将防止以下构造方式:
struct Foo
{
    explicit Foo(int, int);
};

Foo f = {4, 2}; // error!

但在C++03中,我们没有花括号初始化,那么explicit关键字在这里阻止了什么样的构造?


1
据我所知,这里面绝对没有任何东西。只是忽略比禁止更容易。 - Adriano Repetti
这个在C++11中不是已经改变了吗? - Neil Kirk
@NeilKirk 发生了什么?你是指我在问题中指出的内容(大括号初始化)吗? - template boy
抱歉,我没有看到那一部分。 - Neil Kirk
2个回答

5

如果有人使用默认参数更改您的方法的签名,那将会很有趣:

struct Foo
{
    explicit Foo(int, int = 0);
};

使用explicit关键字,你可以习惯性地表达你不希望构造函数进行隐式转换。

4
如果我们有一个带有两个或更多参数的构造函数,那么“explicit”关键字会防止什么呢?
没有任何防止作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接