#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/