将大括号括起来的初始值设定项列表转换为类型时出错的含义

Meaning of error converting brace enclosed initializer list to type?

本文关键字:转换 列表 类型 出错 起来      更新时间:2023-10-16

我正在尝试移植/构建g++以在我的系统上运行,并在构建libstdc++时遇到以下错误:

.../gcc-4.6.2/i686-pc-linux-gnu/libstdc++-v3/include/mutex:226:50:错误:无法将"{0}"从"<brace-enclosed initializer list>"转换为"std::timed_mutex::__native_type {aka pthread_mutex_t}">

include/mutex中的相关代码是:

class timed_mutex
{
    // ...
    __native_type  _M_mutex;
    // ...
    timed_mutex() : _M_mutex(__GTHREAD_MUTEX_INIT) { }  // Line 226
    // ...
}

__native_type pthread_mutex_t__GTHREAD_MUTEX_INIT扩展到{0}

我对C++一点也不熟悉,只是C,但我在这里看不出有什么明显的问题。错误是什么意思?

正确的语法是:

timed_mutex() : _M_mutex({__GTHREAD_MUTEX_INIT}) { }  // i.e. _M_mutex({{0}})

但是,该功能仅适用于 C++11。演示。
对于较旧的编译器,不能将初始值设定项列表与构造函数一起使用。

具有 2 个{}的原因是,pthread_mutex_t 是定义如此处所示的union。它包含structchar[24]long int;因此,初始化语法自然会有所不同。

更新:当我尝试在测试文件中编译<mutex>标头时,它给出了以下错误:

/usr/include/c++/

4.6/bits/c++0x_warning.h:32:2:错误:#error 这个 文件需要编译器和库支持即将推出的 ISO C++ 标准,C++0x。此支持目前处于试验阶段,必须 使用 -std=c++0x 或 -std=gnu++0x 编译器选项启用。

特定文件很可能遵循 C++11 的初始值设定项语法