2016-04-08 3 views
1

Это код:инициализации Кортеж с инициализацией члена

struct ListNode { 
    int val; 
    ListNode *next; 
    ListNode(int x) : val(x), next(NULL) {} 
}; 

std::tuple<int, ListNode*> head{0, &&ListNode(0)}; 

аннотаций ошибка:

expected ‘}’ before ‘(’ token 

Я просто запутался, что здесь произошло, список инициализации не в состоянии принять внутрь инициализации? Я прочитал cppreference.com и C++-праймер. У всех нет такого примера использования. Но, я думаю, это для меня, чтобы сделать что-то вроде этого:

std::tuple<type, class*> n{ type_value, &&class_initialization } 

вместо

std::tuple<type, class*> n{ type_value, class_reference_or_pointer } 
+1

Вы не можете взять адрес временного –

+1

'' && является булево-И оператор, то нужно 2 аргументы –

+0

@BenVoigt Спасибо, я думаю, что я неправильно использовали ссылку rvalue. –

ответ

4
  1. Вы должны использовать единый &, чтобы получить адрес (т.е. ListNode*).

  2. Вы не можете взять адрес временного объекта (то есть ListNode(0)).

Вы можете:

ListNode node(0); 
std::tuple<int, ListNode*> head{0, &node}; 
+0

Спасибо за ваш ответ, и я могу задать другой вопрос: могу ли я использовать ссылку rvalue здесь? Я имею в виду, я заметил, что он временный и хочет передать его в список инициализации. Не могли бы вы рассказать мне, где мои заблуждения? –

+0

@FrankWang Да, можно временно передать временное значение rvalue, но вы пытаетесь передать адрес временного, это не rvalue. – songyuanyao

+0

Да, я только что проверил это и узнал больше о указателе и ссылке. Спасибо за ваш добрый ответ. –