【问题标题】:MSVC refuses to compile `auto` argument in template classMSVC 拒绝在模板类中编译 `auto` 参数
【发布时间】: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&lt;typename U&gt;,则它适用于两个编译器。

【问题讨论】:

  • operator/=(const auto&amp;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


【解决方案1】:

这是一个你可以使用Compiler Explorer的好地方。

clang/LLVM v12 和 GCC 12 也不喜欢默认编译器选项。

最新版本的Visual C++可以编译它,但前提是你启用/std:c++20

【讨论】:

  • 无法重现,GCC 和 Clang 都会为我编译它。你加-std=c++20了吗?
  • 它适用于 gcc 11.2 与 -std=c++20: godbolt.org/z/9d18f67sa
猜你喜欢
  • 2019-02-10
  • 1970-01-01
  • 2019-12-27
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多