为什么下面的代码不能在 MSVC 中编译,而是在 g++ 中编译?



我正试图使用以冒号为主的构造函数初始值设定项列表,但它无法在Microsoft Visual Studio 2019中编译(错误:标识符"名称"未定义,应为"}"(,但它在Linux中的g++(10.2.0版本(中编译和打印输出时没有任何问题。

我也尝试过不同版本的MSVC,比如C++14、C++17,但都没有结果。我知道C++11的所有可能的初始化,但我必须使用带有冒号(:(的初始化。

有没有办法在微软风投中做到这一点?

提前感谢!

#include <string>
#include <iostream>
class Spell {
private:
std::string name;
std::string action;
public:
Spell(std::string name, std::string action) : name(name), action(action) {}
void print() {
std::cout << name;
}
};
int main() {
Spell* spell = new Spell{ name : "test", action : "lol" }; //HERE
spell->print();
}

该语法是一个非标准的GNU扩展,因此任何版本的Microsoft Visual C++都不支持(也可能永远不会支持(。

指定的初始化程序在C++20中是标准化的,但语法不同,它们只能用于聚合初始化。等效的标准指定初始值设定项语法将是Spell{.name = "test", .action = "lol"}。但在这种情况下,这也不起作用,因为Spell不是聚合,因为它有私有数据成员和用户定义的构造函数。

最新更新