- 主题:问个奇怪的对象初始化问题 : A a = b; // B b;
如下代码,在C++20情况下,所有编译器都报错
#include <iostream>
struct C { C() { std::cout << "Constructs C" << std::endl; } };
struct A {
A() { std::cout << "Constructs A" << std::endl; }
A(const C & c) { std::cout << "Constructs A from C" << std::endl; }
};
struct B {
B() { std::cout << "Constructs B" << std::endl; }
operator C () const { return C(); }
};
int main() {
B b;
A a = b;
// Okay in all compilers.
// A a(b);
return 0;
}
在C++11标准下,VS 2019 编译通过,VS2019自带的Clang10编译报错,MinGW下gcc 8.1报错。
【 在 xieyf 的大作中提到: 】
: 假设 B b;
: A和B不同类型, 那么
: cpp标准说 A a = b; 是一定走构造函数的吧, 如果a和b是不同类型, 会首先调用
: ...................
--
FROM 222.129.54.*
我是在Clion调用各个工具链,C++标准是在CMake里面设置的. VS 2019里面latest就是20吧。
【 在 easior 的大作中提到: 】
: 想问一下怎么在 Visual Studio 中启用C++20?
: 我在 Visual Studio Community 2019 的项目属性中只看到了14/17,
: 而且这段代码编译失败。
--
FROM 222.129.54.*
重载的是这个(X)
double d = 1.25;
int i = (int)d;
类似的
B b;
auto c = (C)b;
【 在 easior 的大作中提到: 】
: 小白一问,“operator+类名”这是重载了哪个操作符,类中重载它类构造函数?
: 像这样:
: B b;
: ...................
--
FROM 222.129.50.*
当然可以,static_cast是更安全的写法。重新测试了一下发现这样可以:
auto a = static_cast<A>(B());
【 在 easior 的大作中提到: 】
: 哦,我看了一下 cppreference 网站,发现正如你所说,
: operator 除了操作符重载,还有类型(转换)重载,
: 不知道这种类型重载适不适用于 C++ 风格(static_cast<C>……)?
--
FROM 222.129.50.*