C ++ 11 на лету несоответствие конструкции - PullRequest
2 голосов
/ 06 февраля 2012

В C ++ 11 теперь мы можем создавать объекты на лету в аргументах функции.

Например, мы можем вставить новую пару в std :: map следующим образом:

typedef std::map<char, int> MapType;
MapType my_map;

my_map.insert({'f', 6}); //less verbose than make_pair

Это также работает для std :: vector.Однако для std :: array это странно не работает.

Пример:

#include <iostream>
#include <array>
#include <vector>

using namespace std;

void arr_on_fly(std::array<int, 4> arr)
{
    /*...*/
}

void vec_on_fly(std::vector<int> vec)
{
    /*...*/
}

int main() 
{
vec_on_fly({1, 2, 3, 4});
arr_on_fly({1, 2, 3, 4});
}

Ссылка: http://ideone.com/gvIUF

Почему это не работает?Является ли это недостатком в стандарте C ++ 11?

Ошибка «не удалось преобразовать« {1, 2, 3, 4} »в« std :: array »» кажется абсурдной, поскольку мы можем инициализироватьstd :: array примерно так:

std::array<int, 4u> arr = {1, 2, 3, 4};

Ответы [ 2 ]

2 голосов
/ 06 февраля 2012

Я не знаю причину этого несоответствия.Но добавление дополнительных скобок делает его компиляцией.

arr_on_fly({{1, 2, 3, 4}});
0 голосов
/ 06 февраля 2012

{} перегружены.В решении Балки

arr_on_fly({{1, 2, 3, 4}});

внешние скобки означают выводить-построенный-объект, а самые внутренние скобки означают список-конструктор-инициализатор.

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

arr_on_fly(std :: initializer_list <int>)

, затем приведите ее и отложите обработку на другую функцию, которая должна работать.

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