2016-05-29 2 views
3

array.zero-2 говорит:Что такое begin() == end()?

В случае, N == 0, begin() == end() == уникальное значение. Возвращаемое значение data() не указано.

Что означает это уникальное значение? Означает ли это, что результат выражения begin() == end() является уникальным значением? Я не понимаю, как это имеет смысл, так как bool может быть истинным или ложным, что не очень уникально. Я побежал следующие тесты:

#include <array> 
#include <iostream> 
#include <iomanip> 
#include <type_traits> 

int main() 
{ 
    std::array<int, 0> test; 
    auto b = test.begin(); 
    auto e = test.end(); 
    std::cout << std::boolalpha 
       << (test.begin() == test.end()) 
       << std::is_same<bool, decltype(test.begin() == test.end())>::value 
       << std::is_same<bool, decltype(b == e)>::value; 
} 

It все выходы true, как ожидалось. Затем я подумал, может быть, это будет отличаться для массива с нулевым размером:

int main() 
{ 
    std::array<int, 0> test; 
    std::array<int, 1> test2; 
    std::cout << std::boolalpha 
       << std::is_same< 
        decltype(test.begin() == test.end()), 
        decltype(test2.begin() == test2.end()) 
       >::value 
       << std::is_same< 
        decltype(test.begin()), 
        decltype(test2.begin()) 
       >::value; 
} 

Снова все верно. Итак, что означает «уникальная ценность»? Что имеет уникальное значение?

ответ

6

begin() == end() == unique value более логичное описание, чем фактическое C++. Он утверждает, что begin() совпадает с end(), и оба они равны некоторому уникальному значению.

В основном логическое выражение «a = b = c», за исключением использования C++ ==.

3

begin()==end()==unique value является стандартным сокращением, а не выражением C++.

Это просто означает, что begin() и end() можно оценить без возникновения неопределенного поведения, и их можно сравнить для равенства. Чтобы сделать это для массива с нулевым элементом, они должны дать действительное (сопоставимое) значение, даже если это значение не может быть разыменовано (используется для доступа к элементу массива или любой переменной этого типа, что имеет место для end()).

Возможно, было бы легче, если бы они сказали это более словами, но это жизнь. Многие люди стреляют для краткости по простоте понимания. Тот, кто написал это, вероятно, думает, как математик, но чувствовал, что им нужно использовать синтаксис C++.

Смежные вопросы