【发布时间】:2021-12-19 21:05:50
【问题描述】:
#include <vector>
#include <iostream>
template<typename T>
struct A
{
A& operator/=(const auto&x) { return *this; }
};
int main()
{
A<int> a;
a /= 10;
}
它在 gcc 上编译得很好,而不是在 MSVC 上。它是一个 MSVC 错误吗?
如果我将auto 替换为template<typename U>,则它适用于两个编译器。
【问题讨论】:
-
operator/=(const auto&x)仅从 C++20 开始有效。您是否在编译器选项中启用了/std:c++latest? -
是的,MSVC(2019 社区)拒绝在 C++20 中编译。我试过godbolt和gcc编译,不知道是不是C++20。
-
IIRC,gcc 有一个自 C++14 以来就存在的扩展,它允许代码编译。如果添加
-pedantic-errors标志,它将停止编译:godbolt.org/z/PWqj4eeYa -
所以这实际上是非法的?
-
在C++20之前是非法的。如果您使用 C++20 进行编译,那么应该没问题。在此处指定 C++20 时,看起来它将使用最新版本的 MSVC 进行编译:godbolt.org/z/vYvPozcEa
标签: c++ templates visual-c++ c++17