3

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

4

1 回答 1

2

利用

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

该名称size_type是从属名称。

于 2022-02-13T19:45:39.020 回答