Почему C ++ Concepts требует, чтобы возвращаемый тип являлся ограничением типа, а не типом Primitive? - PullRequest
1 голос
/ 12 апреля 2020

Привет всем. Концепции теперь являются частью стандарта C ++ 20, и, чтобы поиграть с ним, я в основном написал этот пример, который когда-то видел

#include<iostream>

template<typename T>
concept Container= requires (T a){

    { a.size() } -> size_t;
    // others
}

template<Container Holder>
class Demo{};
int main(){


    Demo<std::vector<int>> d;


}

Но при компиляции кода я получил следующую ошибку

ошибка: требование типа возврата не является ограничением типа ({a.size ()} -> size_t;)

Позже я вспомнил, что возвращение ограничение типа не может быть типом примитива и изменяет код с помощью std :: same_as

#include<iostream>

template<typename T>
concept Container= requires (T a){

    { a.size() } -> std::same_as<size_t>;
    // others
}

template<Container Holder>
class Demo{};
int main(){

    Demo<std::vector<int>> d;

}

, где std :: same_as сам по себе является концепцией.

Но почему нельзя использовать примитивные типы? Я знаю, что это что-то ломает в C ++, но я не могу запомнить это.

1 Ответ

3 голосов
/ 12 апреля 2020

Поскольку семантика неоднозначна: означает ли { a.size() } -> size_t, что результат a.size() является конвертируемым в size_t, или decltype(a.size()) в точности такой же, как size_t ?

Таким образом, необходимо использовать ограничение, чтобы прояснить намерение (convertible_to для первого, same_as для второго).

...