Я экспериментировал с концепциями lite в GCC от SVN. Я столкнулся с проблемой, которая, как я подозреваю, связана с моим недостатком понимания, и я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении. Мой код:
#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&)
до определения понятия, и я понятия не имею, почему.
Является ли это ожидаемым поведением с концепциями, или я делаю что-то неправильно?