【发布时间】:2018-11-04 08:39:30
【问题描述】:
在编写一些 C++ 代码(使用 clang、x86_64 linux 编译)时,我不小心写了以下构造:
class Class {
*Class() {}
};
即在构造函数名称前带有星号 (*)。
尝试更多,我注意到您可以在前面放任意数量的 *;它也适用于析构函数,即,
class Class {
********Class() {}
********~Class() {}
};
Clang 编译它没有任何错误或警告。
但是 GCC 会给出警告
控制到达非空函数的结尾
这让我相信我实际上是在声明一个返回类型为void*(或void********)的构造函数/析构函数。并且用值编写任何类型的 return 语句都会产生错误(如预期的那样):
return nullptr;
return {};
...
有趣的是,生成的 LLVM IR 位码正确地包含了一个 void 函数:
define void @_ZN5ClassC2Ev(%struct.Class* %this) {...}
define void @_ZN5ClassD2Ev(%struct.Class* %this) {...}
搜索这方面的任何信息都没有找到任何结果。所以我的问题是:这个标准符合 C++ 还是 GCC 和 Clang 的编译器前端中的错误?或者也许是一些兼容性功能?如果正确,它的用例是什么。
【问题讨论】:
-
MSVC rejects it.