哪个GCC特性编译(const T){}.f();?

pkln4tw6  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(81)

在我尝试结合move语义学习C++的const正确性时,我最终得到了以下代码。
MRE:

#include <iostream>
class ThisReference
{
    public:
    void f() const && { std::cout << "f() const &&\n"; }
};

int main()
{
    (const ThisReference){}.f();
}

Godbolt [所有候选方法都稍微长一点]
该代码使用GCC编译,我以为我理解它的意思,即:

  1. (const ThisReference)定义类型。我希望它是常量,所以我把它放在括号里。
  2. {}执行该类型的初始化;创建对象
  3. .f()调用方法
  4. ;结束语句
    最后我把这些代码放到Visual Studio中,它没有编译。错误消息为
error C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax

我有两个关于代码的问题。
1.我在这里使用了哪个非标准的GCC功能,如何关闭它?
1.我的想法可能是错的。怎么了?

ryoqjall

ryoqjall1#

(const ThisReference) {}

这是一个compound literal,它是C99的特性,而不是C++的特性。
GCC编译此代码是因为它支持将复合文字作为非标准扩展。您可以通过将-Wpedantic -Werror添加到编译器标志中来禁止此操作,或者只添加-Werror=pedantic

<source>: In function 'int main()':
<source>:10:27: error: ISO C++ forbids compound-literals [-Werror=pedantic]
   10 |     (const ThisReference){}.f();
      |

MSVC(Microsoft Visual Studio Compiler)之所以给你那个错误消息,是因为它认为{}是列表初始化,而(const ThisReference)是C风格的强制转换,这两者在C++中通常不能一起出现。
标签:Are compound literals Standard C++?

相关问题