Построение вектора <int>с 2 строковыми литералами - PullRequest
11 голосов
/ 10 июля 2020

Для следующей программы:

#include <vector>
#include <iostream>

int main()
{
  std::vector<int> v = {"a", "b"};
  
  for(int i : v)
    std::cout << i << " ";   
}

clang печатает 97 0. Значение ascii 'a' равно 97, но я не полностью понимаю вывод.

С другой стороны, g cc выдает исключение:

terminate called after throwing an instance of 'std::length_error'
  what():  cannot create std::vector larger than max_size()

, поэтому я предположим, что он использует конструктор с двумя аргументами, который принимает размер и значение по умолчанию, где размер вычисляется из адреса строкового литерала "a".

Если программа правильно сформирована, каково правильное поведение ? Вот код .

1 Ответ

14 голосов
/ 10 июля 2020

Я предполагаю, что он использует конструктор с двумя аргументами, который принимает размер и значение по умолчанию

Нет, он использует конструктор с двумя итераторами ввода. "a" и "b" могут распадаться на указатель, который является действительным итератором. В качестве указателя (итератора) на const char разыменованный const char будет преобразован в int и добавлен как элемент vector. В любом случае в коде есть UB, потому что "a" и "b" не относятся к допустимому диапазону, "b" недоступен из "a".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...