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
是从属名字。
下面是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
是从属名字。