哪个 GCC 功能可以编译 (const T){}.f();?

Tho*_*ler 5 c++ gcc

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

再次:

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

int main()
{
    (const ThisReference){}.f();
}
Run Code Online (Sandbox Code Playgroud)

Godbolt [所有候选方法的时间稍长一些]

该代码使用 GCC 编译,我我明白它的意思,即:

  1. (const ThisReference)定义类型。我希望它是 const,所以我把它放在括号中。
  2. {}执行该类型的初始化;创建一个对象
  3. .f()调用方法
  4. ;结束声明

最终我将该代码放入 Visual Studio 中,但它没有编译。错误信息是

error C4576: a parenthesized type followed by an initializer list is a non-standard explicit type conversion syntax
Run Code Online (Sandbox Code Playgroud)

我对我的代码有两个问题。

  1. 我在这里使用了哪些非标准 GCC 功能以及如何将其关闭?
  2. 我的想法可能有问题。怎么了?

Jan*_*tke 8

(const ThisReference) {}
Run Code Online (Sandbox Code Playgroud)

这是一个复合文字,它是 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();
      | 
Run Code Online (Sandbox Code Playgroud)

查看现场演示

MSVC(Microsoft Visual Studio编译器)给你这个错误消息的原因是它认为{}是列表初始化,并且(const ThisReference)是C风格的强制转换,而这两者通常不能同时出现在C++中。


另请参阅:复合文字是标准 C++ 吗?

  • 添加:您可以在 C++ 中使用类型别名来实现此目的:`using ThisConstRef = const ThisReference; ThisConstRef{}.f();` (2认同)