【发布时间】:2025-12-13 13:05:02
【问题描述】:
以下代码在我尝试过的所有 GCC 版本(在 C++98、C++11 和 C++14 模式下)都会产生后续编译错误:
struct T
{
T(void* x) : (x) {}
};
// main.cpp: In constructor 'T::T(void*)':
// main.cpp:3:18: error: anachronistic old-style base class initializer [-fpermissive]
// T(void* x) : (x) {}
// ^
// main.cpp:3:16: error: unnamed initializer for 'T', which has no base classes
// T(void* x) : (x) {}
当然,这显然是错误的代码,因为我实际上并没有初始化任何东西。
但是为什么它是一个基类初始化器,为什么它是“不合时宜的”,而不是简单的错误?它曾经有效吗?什么时候?它是什么意思?
我在网上发现的only related references 有人在成员名称意外宏化时遇到错误,实际上导致与上面相同的代码:
#define bar
// ^ some library could have done this
struct T
{
T(int x)
: bar(x) // effectively just `: (x)`
{}
int bar; // will cause its own error
};
那些人从来没有发现错误的含义,尽管他们后来至少发现了他们的程序被破坏的原因。
【问题讨论】:
-
我会猜测这个语法是 C 中带有类的基类初始化语法,就在最早的 [非标准] C++ 引入多重继承之前。
-
这对我来说似乎也是最合理的假设。不幸的是,我无法通过通常的渠道找到“C++ 编程语言”的第一版或第二版。不过,我敢肯定 SO 上有人有。
-
寻找“注释参考手册”(ARM)也许?
-
把所有 C++ 标签放在一个问题上的好借口 :-)