c++ - 为什么 C++20 不支持 "void f(Concept const auto&)"?

标签 c++ templates standards c++20 c++-concepts

#include <string>

template<typename T>
concept HasSize = requires(T obj)
{
    obj.size();    
};

void f1(HasSize auto arg) {} // ok
void f2(HasSize auto&& arg) {} // ok
void f3(HasSize decltype(auto) arg) {} // ok
void f4(HasSize auto& arg) {}  // ok
void f5(HasSize auto* arg) {}  // ok

void f6(HasSize const auto& arg) {} // error

int main()
{
    std::string str{};

    f1(std::string{});
    f2(std::string{});
    f3(std::string{});
    f4(str);
    f5(&str);
    f6(str);
}

使用 clang++ -std=c++20 -stdlib=libc++ z.cpp 编译错误消息是:
z.cpp:15:6: error: variable has incomplete type 'void'
void f6(HasSize const auto& arg) {} // error
     ^
z.cpp:15:9: error: too few template arguments for concept 'HasSize'
void f6(HasSize const auto& arg) {} // error
        ^
z.cpp:4:9: note: template is declared here
concept HasSize = requires(T obj)
        ^
z.cpp:15:33: error: expected ';' after top level declarator
void f6(HasSize const auto& arg) {} // error
                                ^
                                ;
3 errors generated.

为什么 C++20 不支持“void f(Concept const auto&)”?

最佳答案

你有语法错误。

类型约束,例如概念 HasSize在这里,直接属于占位符类型说明符之前,即在 auto 之前或 decltype(auto) :

void f6(const HasSize auto& arg) {}

[dcl.spec.auto] C++20 草案。

cv 限定符,例如 const , 与占位符类型说明符分开,请参阅 [decl.type]/1 .

正如@super 在问题评论中提到的 decltype(auto)不允许在函数参数中使用。所以这似乎是一个 Clang 错误来接受它,见 [dcl.spec.auto]/2它只允许函数参数中占位符类型说明符的自动大小写。

关于c++ - 为什么 C++20 不支持 "void f(Concept const auto&)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61118420/

相关文章:

c++ - #define 与运算符一起使用

c++ - Unicode 字符 "GREEK CAPITAL LETTER DELTA"在 C++ 和 GLStudio 中呈现为 "White vertical rectangle"

c++ - STL 术语中的一对一关系

c++ - 推断成员函数的返回类型

c++ - 如何重载 operator<< 以输出在模板内定义的 vector ?

c - 'global' 和 'static global' 之间的区别

c++ - g_main_loop 使用 100% CPU

c++ - 专门化模板成员函数以针对特殊模板类以不同的方式工作

c++ - C 和 C++ 标准对假设的三元硬件架构的适应性如何?

c++ - 哪个编译器支持带默认参数的函数指针?