gpt4 book ai didi

c++ - C++11 中的隐式构造函数参数转换

转载 作者:太空狗 更新时间:2023-10-29 23:05:57 24 4
gpt4 key购买 nike

让我们考虑以下代码:

class A{
public:
A(int x){}
};

class B{
public:
B(A a){};
};


int main() {
B b = 5;
return 0;
}

编译器在编译时提示:

/home/test/main.cpp:80: candidate constructor not viable: no known conversion from 'int' to 'A' for 1st argument

我不想创建 B(int) 构造函数 - 我希望编译器将此 int 隐式转换为 A 对象.

编辑:

直接初始化是这样的:

B b(5);

是否可以改用赋值运算符?

最佳答案

明确一点:

B b = 5;

是“复制初始化”而不是赋值。 (参见 http://www.gotw.ca/gotw/036.htm)。

在这种情况下,您要求编译器首先执行两个隐式用户定义的转换,即 int -> A, A -> B 在临时 B 之前对象被传递给 B b 的复制构造函数。允许编译器省略临时对象,但从语义上讲,您仍然要求语言跨类型进行两次跳转。

编程语言中的所有隐式行为本质上都是可怕的。为了一点语法糖的缘故,我们要求 c++ “做一些魔术让它正常工作”。意外的类型转换会破坏大型复杂程序。否则,每次您编写一个新函数或一个新类时,您都必须担心它可能影响的所有其他类型和函数,而副作用会在您的代码中泛滥成灾。你真的想要隐式转换从 int -> apple -> horse -> horse_power -> 飞机?

因此,c++ 只允许一个隐式的用户定义转换:

12.3 转化 [class.conv]

1 Type conversions of class objects can be specified by constructors and by conversion functions. These conversions are called user-defined conversions and are used for implicit type conversions (clause 4), for initialization (8.5), and for explicit type conversions (5.4, 5.2.9).

4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.

您最好使用显式强制转换或“直接初始化”,这两种方法都可以让编译器和合作者清楚地知道您正在尝试做什么。传统的或新的统一初始化语法都有效:

B b(5);
B b{5};
B b = {5};

关于c++ - C++11 中的隐式构造函数参数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17339895/

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