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

15
我已经从GCC-4.7.0的主干版本中构建了MinGW:http://code.google.com/p/mingw-builds/downloads/list。在这个版本的更改说明中,它说实现了非静态数据成员初始化:http://gcc.gnu.org/gcc-4.7/changes.htmlhttp://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;
}

我收到了很多错误信息,其中这个是最后一个:

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' 解析地址

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

4
我没有安装GCC 4.7来测试它,而且我的版本不支持成员初始化,但是你是否使用-std=c++0x标志编译它? - Griwes
请注意,成员初始化是GCC 4.7中的新功能,因此这应该是一个简单的编译器错误。 - Nicol Bolas
2个回答

14

问题似乎在于确定您是在声明函数还是对象时存在歧义,而编译器选择了函数。

您应该尝试使用这种语法来初始化字符串:

std::string s = "string";

如果我们从GCC Release Notes关于非静态数据成员初始值设定项的链接(proposal N2756),在问题1中提到了这一点,并在解决方案说明中写道:

CWG在Kona进行了一个6比3的草草投票,支持类作用域查找; 这就是本文所提出的,对于非静态数据成员的初始化器仅限于“=初始化表达式”和“{ 初始化列表 }”的形式。


这是否意味着 std::string s("string"); 是一个有效的函数声明?你能解释一下我应该如何理解它吗? - Björn Pollex
3
这个也适用于被标记为 explicit 的构造函数吗?不管怎样,我可能更喜欢 std::string s{"string"}; - Konrad Rudolph
@Björn:这不是一个有效的声明。如果它是一个有效的函数声明,就不会有编译错误了。 - Nikos C.

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接