2016-11-01 5 views
2

Что мешает этой инициализации работать?Использование оператора преобразования для инициализации карты

#include <map> 
using std::map; using std::pair; using std::make_pair; 
struct P { 
    char a_, b_; 
    P(char a, char b) : a_{a}, b_{b} {} 
    operator pair<char,char>() { return make_pair(a_, b_); } 
}; 
int main() { 
    map<char,char> qmap { P('a','b') }; 
} 

Похоже, что оператор преобразования в P не может быть применен неявно внутри рамно-initialisier-лист? Или что-то еще?

ответ

3

Он может, но вы забыли ключевой момент: map «s value_type фактически pair<const Key, Value>, поэтому в вашем примере вам потребуется два преобразования (Ppair<char, char>pair<char const, char>), чтобы удовлетворить ваши qmap» S value_type. Это еще одно преобразование, разрешенное правилами.

При смене оператора преобразования в

operator pair<char const,char>() { return make_pair(a_, b_); } 

код compiles.

+1

два ответа одновременно. вы получаете «принять» ... – towi

4

Обратите внимание, что ключевая часть std::map является константой, поэтому тип элемента std::map<char, char> равен std::pair<const char, char>; тип здесь не соответствует. Возвращаемый std::pair<char, char> с фигурными скобками не может использоваться для построения std::initializer_list<std::pair<const char, char>> (а затем дополнительно построить std::map<char, char>).

Если вы измените его на

operator pair<const char,char>() { return make_pair(a_, b_); } 

или

operator std::map<char, char>::value_type() { return make_pair(a_, b_); } 

код будет работать нормально.

+1

два ответа одновременно. вы получаете «upvote» ... – towi

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

  • Нет связанных вопросов^_^