Предположим следующий код (собранный на основе материалов @Wutz, @Jarod42 и @wohlstad):
p>
Код: Выделить всё
#include
#include
template
concept has_set = requires(T t) {
{ t.set(
[](){ struct {
operator std::string_view();
operator std::string();
operator char *();
} s; return s; }()
) } -> std::same_as;
};
struct Foo {};
static_assert(!has_set);
struct Bar {
void set(std::string_view);
};
static_assert(has_set);
struct Baz {
void set(int i);
void set(std::string) const noexcept;
};
static_assert(has_set);
struct Bazz {
void set(char *);
};
static_assert(has_set);
struct Bazzz {
void set(char *);
void set(std::string);
};
// Why do we have a build failure here?
// static_assert(has_set);
- Пожалуйста, объясните, как и почему оператор преобразования типа, используемого в качестве аргумента для t.set в выражении require, имеет вид оценивается во время реализации концепции.
- Пожалуйста, объясните, почему набор перегрузок Bazzz приводит к сбою сборки концепции
Подробнее здесь: https://stackoverflow.com/questions/791 ... s-in-a-req