C++ 使用新表达式初始化非静态数据成员

C++ 使用新表达式初始化非静态数据成员,c++,c++11,gcc,language-lawyer,C++,C++11,Gcc,Language Lawyer,考虑以下代码: #include <map> template <typename T> struct X { std::map<int, T>* storage = new std::map<int, T>(); }; int main() { X<int> x; } 有趣的是,在我看来应该是可行的 这一个编译: #include <map> template <typename T>

考虑以下代码:

#include <map>

template <typename T>
struct X {
    std::map<int, T>* storage = new std::map<int, T>();
};

int main() {
    X<int> x;
}

有趣的是,在我看来应该是可行的

这一个编译:

#include <map>

template <typename T>
struct X {
   typedef std::map<int, T> mt;
   mt *storage = new mt();
};

int main() {
        X<int> x;
}

这是中描述的问题的另一个示例(参见“2011年8月会议的说明”,其中有一个非常类似的示例),即当编译器试图确定表达式的结尾时,模板参数列表中的逗号会导致解析失败

这个问题仍然悬而未决,但委员会的共识是,应该让它发挥作用(不过我不知道会有什么变化使它生效)


Clang已经实施了一段时间的变通方法(可能是暂时解析表达式,如果失败就重试),Nathan Sidwell已经这样做了,所以我希望他计划尽快修复它。

只是想确定一下:您使用的是
gcc
还是
g++
?我经常混淆它……@ ATLSTE G+4.4.2也不编译。@ atlaste Dude,显然我们使用C++编译器——如果我们使用C编译器,它会抱怨这个代码中的各种其他事情。解决方法:使用一个支持的init列表来规避(错误的)
g++
=>
模板结构X{std::map*存储{new std::map()};}@FilipRoséen refp,G++没有问题,它遵守了标准,请参阅(使用括号内的init列表是一个有效的解决方法)核心问题325似乎与默认值有关arguments@sp2danny,继续阅读,参见“2011年8月会议记录”,其中有一个非常类似的例子
#include <map>

template <typename T>
struct X {
   typedef std::map<int, T> mt;
   mt *storage = new mt();
};

int main() {
        X<int> x;
}
g++ -o test test.cpp -std=c++11