gpt4 book ai didi

带有大括号初始值设定项的 C++ 隐式转换

转载 作者:可可西里 更新时间:2023-11-01 17:55:51 26 4
gpt4 key购买 nike

我最近在某处(不记得在哪里)读到关于使用大括号允许多个用户定义的转换,但是构造函数转换和我不理解的转换方法转换之间似乎有区别。

考虑:

#include <string>

using ::std::string;

struct C {
C() {}
};

struct A {
A(const string& s) {} // Make std::string convertible to A.
operator C() const { return C(); } // Makes A convertible to C.
};

struct B {
B() {}
B(const A& a) {} // Makes A convertible to B.
};

int main() {
B b;
C c;

// This works.
// Conversion chain (all thru ctors): char* -> string -> A -> B
b = {{"char *"}};

// These two attempts to make the final conversion through A's
// conversion method yield compiler errors.
c = {{"char *"}};
c = {{{"char *"}}};
// On the other hand, this does work (not surprisingly).
c = A{"char *"};
}

现在,我可能误解了编译器正在做什么,但是(基于上述和其他实验)在我看来它没有考虑通过转换方法进行转换。然而,通读标准的第 4 节和第 13.3.3.1 节,我无法找到这是为什么的线索。什么解释?

更新

我想解释一下另一个有趣的现象。如果我添加

struct D {
void operator<<(const B& b) {}
};

并在main :

  D d;
d << {{ "char *" }};

我得到一个错误,但如果我改为写 d.operator<<({{ "char *" }});它工作正常。

更新 2

看起来标准中的第 8.5.4 节可能包含一些答案。我会报告我的发现。

最佳答案

只有一次用户转化。

b = {{"char *"}};

我们确实如此

b = B{{"char*"}}; // B has constructor with A (and a copy constructor not viable here)

所以

b = B{A{"char*"}}; // One implicit conversion const char* -> std::string

c = {{"const char*"}} 中,我们尝试

c = C{{"char *"}}; // but nothing to construct here.

关于带有大括号初始值设定项的 C++ 隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37482588/

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