【问题标题】:non-static data member initializers questions非静态数据成员初始化器问题
【发布时间】:2011-12-02 05:27:09
【问题描述】:

我已经从主干版 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;
}

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

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

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

【问题讨论】:

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

标签: c++ c++11


【解决方案1】:

问题似乎是在确定您是声明函数还是对象以及编译器选择函数时模棱两可。

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

std::string s = "string";

如果我们点击 GCC 发行说明中关于非静态数据成员初始化程序 (proposal N2756) 的链接,他们会在问题 1 中提到这一点,并附上解决说明:

CWG 在 Kona 进行了 6 比 3 的投票,支持类范围查找; 这就是本文的建议,使用非静态初始化器 数据成员仅限于“= initializer-clause”和“{ initializer-list }” 形式。

【讨论】:

  • 这是否意味着std::string s("string"); 是一个有效的函数声明?你能解释一下我应该如何解释它吗?
  • 这也适用于explicit 的构造函数吗?不管怎样,我可能更喜欢std::string s{"string"};
  • @Björn:这不是一个有效的声明。如果是有效的函数声明,则不会出现编译错误。
【解决方案2】:

数据成员必须由大括号或等号初始化器初始化。 访问http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2008/n2756.htm

8.5 初始化程序 [dcl.init]

更改初始化器的语法:

初始化器:

= (  expression-list  )

大括号或等号初始化器:

=  initializer-clause

   braced-init-list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多