相关疑难解决方法(0)

为什么我不需要在 C++20 中的依赖类型之前指定“typename”?

这段代码在 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)

代码游乐场

c++ templates typename language-lawyer c++20

70
推荐指数
2
解决办法
3656
查看次数

编译器是否可以决定忽略 C++20 仍需要的依赖类型上缺失的类型名?

以下代码可以使用 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 的方法之间的差异在于以下代码 …

c++ typename language-lawyer c++20

13
推荐指数
1
解决办法
309
查看次数

标签 统计

c++ ×2

c++20 ×2

language-lawyer ×2

typename ×2

templates ×1