gpt4 book ai didi

c++ - 使用转换运算符复制初始化

转载 作者:行者123 更新时间:2023-12-01 14:04:26 24 4
gpt4 key购买 nike

copy_initialization里面有代码

struct A 
{
operator int() { return 12;}
};

struct B
{
B(int) {}
};
int main()
{
....
A a;
B b0 = 12;
// B b1 = a; //< error: conversion from 'A' to non-scalar type 'B' requested
B b2{a}; // < identical, calling A::operator int(), then B::B(int)
B b3 = {a}; // <
auto b4 = B{a}; // <
}

现在的问题是
  • 在 b2 的情况下,直接初始化如何工作?可以直接初始化调用转换运算符吗?
  • 为什么 b1 的复制初始化失败?隐式 A 应该转换为 int 并且可以调用 B 的构造函数。
  • b3 也是复制初始化,但它有效。为什么这样?
  • 最佳答案

    这很简单:隐式可转换性(对于用户定义的类型)不是 C++ 中的传递属性。也就是说,虽然 A可转换为 int , 和 int可转换为 B ,这本身并不意味着 A可转换为 B .没有来自 A 的有效隐式转换序列至 B ,所以 A不可转换为 B .

    复制初始化需要初始化表达式的类型和被初始化的类型之间的隐式转换。自 A不可转换为 B , b1不编译。

    任何时候看到 {}作为这样的初始化的一部分,那么这意味着它所应用的对象将经历某种形式的列表初始化,这是与其他形式的初始化不同的过程。
    b2不执行“直接初始化”。它直接执行 列表初始化,这是列表初始化的两种形式之一。在这种情况下,列表初始化的规则最终归结为对 B 的构造函数集使用重载决议。 .有一个 B 的构造函数可以用 A 调用,因为该调用可以通过 A 的隐式转换发生到 int .
    b3不是“复制初始化”;它是拷贝列表初始化,这与“复制初始化”完全无关。复制列表初始化与直接列表初始化相同,只有两个异常(exception),两者都不适用于这种情况。所以它和 b2 做同样的事情.

    关于c++ - 使用转换运算符复制初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60953866/

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