这段代码在 C++20(使用 gcc 10.1)中编译,typename在依赖类型之前没有使用关键字std::vector<T>::iterator。为什么要编译?
#include <vector>
template<typename T>
std::vector<T>::iterator // Why does this not require "typename" before it?
f() { return {}; }
int main() {
auto fptr = &f<int>;
}
Run Code Online (Sandbox Code Playgroud)
以下代码可以使用 MSVC 进行编译,但在 GCC 和 Clang 中会失败,因为typename在依赖类型之前缺少:
struct Foo { struct value{ }; };
struct Bar { int value; };
template<typename T>
constexpr size_t SIZE = sizeof(T::value); // missing typename here, for Foo
constexpr size_t s1 = SIZE<Foo>; // missing typename before dependent type above
constexpr size_t s2 = SIZE<Bar>;
Run Code Online (Sandbox Code Playgroud)
MSVC 方法不需要 typename sizeof,这似乎是合理的,因为 sizeof 对类型和变量都适用。另一方面,GCC 和 Clang 似乎按规矩办事,因为这是typename 即使在 C++20 中您仍然需要的情况之一,当上下文无法向编译器显示它是否会满足类型或多变的。
问题是这里MSVC是否允许宽容,即编译器如果不加 也能正确执行所需的操作typename,是否允许这样做?还是与规范相矛盾?
MSVC 与 Clang 和 GCC 的方法之间的差异在于以下代码 …