在我尝试结合移动语义学习 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 编译,我想我明白它的意思,即:
(const ThisReference)定义类型。我希望它是 const,所以我把它放在括号中。{}执行该类型的初始化;创建一个对象.f()调用方法;结束声明最终我将该代码放入 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)
我对我的代码有两个问题。
(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++ 吗?
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |