在我尝试结合move语义学习C++的const正确性时,我最终得到了以下代码。
MRE:
#include <iostream>
class ThisReference
{
public:
void f() const && { std::cout << "f() const &&\n"; }
};
int main()
{
(const ThisReference){}.f();
}
Godbolt [所有候选方法都稍微长一点]
该代码使用GCC编译,我以为我理解它的意思,即:
(const ThisReference)
定义类型。我希望它是常量,所以我把它放在括号里。{}
执行该类型的初始化;创建对象.f()
调用方法;
结束语句
最后我把这些代码放到Visual Studio中,它没有编译。错误消息为
error C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
我有两个关于代码的问题。
1.我在这里使用了哪个非标准的GCC功能,如何关闭它?
1.我的想法可能是错的。怎么了?
1条答案
按热度按时间ryoqjall1#
这是一个compound literal,它是C99的特性,而不是C++的特性。
GCC编译此代码是因为它支持将复合文字作为非标准扩展。您可以通过将
-Wpedantic -Werror
添加到编译器标志中来禁止此操作,或者只添加-Werror=pedantic
:MSVC(Microsoft Visual Studio Compiler)之所以给你那个错误消息,是因为它认为
{}
是列表初始化,而(const ThisReference)
是C风格的强制转换,这两者在C++中通常不能一起出现。标签:Are compound literals Standard C++?