我一直在尝试来自 SVN 的 GCC 中的精简概念。我遇到了一个我怀疑是由于我缺乏理解的问题,如果有人能指出我正确的方向,我将不胜感激。我的代码是:
#include <iostream>
#include <string>
// Uncomment this declaration to change behaviour
//void draw(const std::string&);
template <typename T>
concept bool Drawable() {
return requires (const T& t) {
{ draw(t) }
};
}
void draw(const std::string& s)
{
std::cout << s << "\n";
}
int main()
{
static_assert(Drawable<std::string>()); // Fails
}
在这里,我定义了一个简单的概念,Drawable
它旨在要求给定类型的参数const T&
,函数draw(t)
编译。
然后我定义了一个draw(const std::string&)
将字符串“绘制”到cout
. 最后,我检查是否std::string
与Drawable
概念匹配——这是我预料到的,因为在调用draw()
时,适当的函数在范围内static_assert
。
draw(const std::string&)
但是,静态断言失败,除非我在概念定义之前包含声明,我不知道为什么。
这是概念上的预期行为,还是我做错了什么?