Есть ли способ инициализировать новую переменную структуры, которая не требует написания конструктора? - PullRequest
0 голосов
/ 22 мая 2018

Я думаю, что смутно припоминаю, что один из более новых стандартов c ++ (может быть, его c ++ 11 или, может быть, 14? ... 17 ??) позволяет вам инициализировать структуру, посредством чего вы можете определить структуру, а затеминициализируйте его без необходимости писать конструктор.

Например:

struct test
{
    int a;
    int b;
    std::string str;
};

int main()
{
    std::map<int, test> test_map;
    test_map[0] = test(1, 2, "test1"); // This is the line in question
    // Or it might be more like: test_map[0] = test{1, 2, "test1"};
    return 0;
}

Я не могу вспомнить имя этой специальной инициализации (или, если она вообще существует) !.Итак, мои вопросы:

  • Есть ли какой-то новый механизм для достижения этого без записи конструктора в структуре "test"?
  • Если так, как он называется (так что я могуподробнее об этом).

Если эта «особенность» не существует, то, пожалуйста, избавьте меня от моих страданий! Возможно, мое воображение это придумало ...

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Вы также можете по умолчанию инициализировать:

struct test {
    int a{1};
    int b{2};
    std::string str{"test1"};
};

Или создать без присваивания:

std::map<int, test> test_map{ 
    {0, {1, 2, "test1"}}
};

Или вставить без копирования:

test_map.emplace(std::piecewise_construct,
    std::forward_as_tuple(0),
    std::forward_as_tuple(1, 2, "test1"));
0 голосов
/ 23 мая 2018

«Инициализация без конструктора» называется Совокупная инициализация , она всегда была частью C ++ с первого дня. К сожалению, некоторые могут сказать.

В C ++ 98вы могли бы написать:

std::map<int, test> test_map;
test temp = { 1, 2, "test1" };
test_map[0] = temp;

C ++ 11 добавил, что вы можете использовать агрегатную инициализацию в prvalues, поэтому вам не нужно объявлять промежуточную переменную (и нет дополнительных копий):

std::map<int, test> test_map;
test_map[0] = { 1, 2, "test1" };

std::map<int, test> m2 = { {0, {1, 2, "test2"}} };    // and this
0 голосов
/ 22 мая 2018

Без конструктора вы можете сделать это следующим образом

test_map[0] = test{ 1, 2, "test1" };

или просто

test_map[0] = { 1, 2, "test1" };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...