花括号包含的初始化列表转换为什么类型出错的含义?

3
我正在尝试将g++移植/构建到我的系统上,并在构建libstdc++时遇到以下错误:
.../gcc-4.6.2/i686-pc-linux-gnu/libstdc++-v3/include/mutex:226:50: 错误: 不能将'{0}'从''转换为'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_typepthread_mutex_t__GTHREAD_MUTEX_INIT 被展开为 {0}

我对 C++ 不是很熟悉,只了解 C,但我在这里没有看到任何明显的错误。那么这个错误是什么意思呢?

1个回答

2
正确的语法是:

正确的语法如下:

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

然而,只有使用C++11才能使用该功能。演示。 对于旧编译器,您不能在构造函数中使用初始化列表
之所以有两个{}是因为pthread_mutex_t 是一个 union,如此处所示。其中包含一个structchar [24]long int;因此,自然的初始化语法会有所不同。
更新: 当我尝试在测试文件中编译<mutex>头文件时,它会出现以下错误:

/usr/include/c++/4.6/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.

很可能这个特定的文件遵循C++11的初始化语法

这段代码是libstdc++的一部分,不是我写的代码。实际上,我只是通过将定义从{0}更改为{{{0}}}来使其工作,但我有点困惑为什么花括号的层级数量会有影响。这是否是C++与C不同的一个方面? - R.. GitHub STOP HELPING ICE
@R..,我已经更新了答案。请注意,pthread_mutex_t是一个拥有3个元素的联合体。也许您的编译器比较老,或者不支持某些g++扩展。 - iammilind
无论如何+1并接受。也许由于我做的事情不太清楚,你的答案做出了一些错误的假设,但它让我走上了解决问题的正确轨道。我仍然很想知道C++是否真的需要匹配大括号级别来进行初始化(而C则不需要)。 - R.. GitHub STOP HELPING ICE
是的,我正在尝试构建libstdc++作为GCC/G++构建过程的一部分。它是与编译器(GCC 4.6.2)匹配的版本,因此C++11支持不是问题。问题在于它不喜欢我的系统定义的PTHREAD_MUTEX_INITIALIZER - R.. GitHub STOP HELPING ICE
1
这些都没问题,但与问题无关。只要g++对主机系统满意,它就可以完美地编译自己的源代码。问题在于PTHREAD_MUTEX_INITIALIZER的定义不兼容C++。 - R.. GitHub STOP HELPING ICE
显示剩余3条评论

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