gpt4 book ai didi

c++ - 何时对多参数构造函数使用显式说明符?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:07 25 4
gpt4 key购买 nike

我最近了解了 explicit 说明符。

假设我们有:

f( W, W, W );

现在如果我们这样做

f( 42, 3.14, "seven" );

编译器将尝试进行以下隐式转换:

f( W(42), W(3.14), W("seven") );

如果我们已经为W定义了匹配的构造函数,即:

W(int);
W(double);
W(std::string);

...它会成功。

但是,如果我们明确第一个:

explicit W(int);

...这将禁用隐式转换。

你现在必须写:

f( W(42), 3.14, "seven" );

即它迫使您明确说明转换

现在开始问题:

可以这样写:

explicit W(int,int); // 2 arguments!

编译成功!

但我看不到任何可能需要这种语法的相应场景。

谁能提供一个最小的例子?

最佳答案

如果您的构造函数是显式的并且该类不提供采用 initializer_list<T> 的非显式构造函数, 那么你不能复制列表初始化一个实例。

W w = {1,2}; // compiles without explicit, but not with

Simple live example

#include <iostream>

class A
{
public:
explicit A(int, int) {}
};

class B
{
public:
B(int, int) {}
};

int main()
{
B b = {1,2};
A a = {1,2};
}

标准引用:

8.5/16

— If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized (8.5.4).

8.5.4/3

List-initialization of an object or reference of type T is defined as follows: ...

Otherwise, if T is a class type, constructors are considered. The applicable constructors are enumerated and the best one is chosen through overload resolution (13.3, 13.3.1.7). If a narrowing conversion (see below) is required to convert any of the arguments, the program is ill-formed.

关于c++ - 何时对多参数构造函数使用显式说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27645671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com