这是一个简单的代码,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 相比发生了什么变化,导致这种语法无效,而不是盲目地应用解决方法补丁。