Для домашнего задания я пытаюсь создать свои собственные версии std::find
, std::begin
, std::end
и std::size
.
Я написал некоторый код, похожий на это:
#include <vector>
template <typename I, typename T>
I find(const I& beg, const I& end, const T& sought)
{/* ... */}
template <typename T, size_t S>
T* begin(T (&a)[S])
{return &a;}
template <typename T, size_t S>
T* end(T (&a)[S])
{return &a + S;}
template <typename T, size_t S>
constexpr size_t size(T (&)[S])
{return S;}
int main()
{
std::vector<int> vec = {0, 1, 2, 3};
// ...
// test not-found case (and `size()`)
find(begin(vec), end(vec), size(vec));
// ...
return 0;
}
(size_t
должно неявно преобразовываться в int
)
Однако при компиляции clang выдает следующую ошибку:
$ clang++ -o program ./*.cpp -std=c++11 -Wall -Wextra -Wpedantic -Wconversion -Wnon-virtual-dtor
./main.cpp:##:##: error: no matching function for call to 'size'
find(begin(vec), end(vec), size(vec)
^~~~
./main.cpp:##:##: note: candidate template ignored: could not match 'T [S]' against 'std::vector<int>'
constexpr size_t size(T (&)[S])
^
1 error generated.
Что меня действительно сбивает с толку, так это то, что и size()
, и begin()
/ end()
имеют одинаковую структуру шаблона и список параметров, и тем не менее первый выдает ошибку компиляции, в то время как последние не дают, когда передается один и тот же ввод.
Я не думаю, что проблема заключается в другом типе возвращаемого значения, поскольку, если бы оно было find()
, было бы жаловаться, а не size()
.
Так чем же size()
отличается от других функций? что будет выдавать эту ошибку с той же структурой шаблона, списком параметров и вводом?