为什么以下代码不能在 MSVC 中编译而在 g++ 中可以?

问题描述

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

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

有没有办法在 MSVC 中做到这一点?

提前致谢!

#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 不是聚合,因为它具有私有数据成员和用户定义的构造函数。