std::basic_string<T>::size_type导致C++20模式编译错误

std::basic_string<T>::size_type causes compile error in C++20 mode

下面是MSVC 2022在C++17模式下编译,但在C++20模式下编译失败的简单代码:

template <typename T>
void foo()
{
    std::basic_string<T>::size_type bar_size; //This fails to compile in C++20
}

C++20模式报错无助于解释原因:error C3878: syntax error: unexpected token 'identifier' following 'expression'

有趣的是,它只发生在模板函数内部,这个反例在 C++20 模式(以及 C++17)下编译良好:

void baz()
{
    std::basic_string<char>::size_type bar_size;
}

到目前为止,我能解决这个问题的唯一方法是使用 auto 而不是显式数据类型,例如:

template <typename T>
void foo()
{
    std::basic_string<T> bar;
    auto bar_size = bar.size();
}

但我真的很想了解 C++20 与 C++17 相比发生了什么变化,导致此语法无效,而不是盲目地应用变通补丁。

使用

typename std::basic_string<T>::size_type bar_size;

名字size_type是从属名字。