非静态数据成员初始化者问题

niX*_*man 14 c++ c++11

我从主干版GCC-4.7.0构建了MinGW:http://code.google.com/p/mingw-builds/downloads/list

在对此版本的更改的描述中,可以说实现了非静态数据成员初始化程序:http://gcc.gnu.org/gcc-4.7/changes.html

http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

当我尝试编译这样一个例子时:

#include <iostream>
#include <string>

struct type {
   type()
      :i(33)
   {}

   int i;
   std::string s("string");
};

int main() {
   type t;
   std::cout << t.i << " : " << t.s << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我收到了很多错误,最后这个错误:

main.cpp:16:35:注意:'std :: string(type :: )(int){aka std :: basic_string(type ::)(int)}'不是从'const std :: basic_string <派生的_CharT,_Traits,_Alloc>'main.cpp:16:35:注意:无法解析重载函数't.type :: s'中的地址

但根据文档,代码是正确的.

JRL*_*JRL 14

在确定是否声明函数或对象时,问题似乎是模糊不清,编译器正在选择函数.

您应该尝试使用以下语法初始化字符串:

std::string s = "string";
Run Code Online (Sandbox Code Playgroud)

如果我们按照GCC发行说明中关于非静态数据成员初始化程序的链接(建议N2756),他们在问题1中提到了这一点,并且该解决方案注意:

CWG在Kona进行了6比3的民意调查,支持分类范围查询; 这就是本文提出的内容,非静态数据成员的初始化程序仅限于"= initializer-clause"和"{initializer-list}"形式.

  • 这对于"显式"的构造函数是否也有效?无论哪种方式,我可能更喜欢`std :: string s {"string"};`. (3认同)