Список инициализаторов C ++ 0x, переданный по ссылке - PullRequest
8 голосов
/ 10 июня 2011

Я пытался использовать список инициализатора C ++ 0x в качестве аргумента вызова конструктора следующим образом:

Foo<float> foo("Foo 1", std::vector<const char *>({ "foo A", "foo B" }) );

с конструктором

Foo(const char *name, std::vector<const char *> &foos)

С этим конструктором компиляторпожаловался:

error: no matching function for call to Foo<float>::Foo(
    const char [5], std::vector<const char *, std::allocator<const char *> >)
note: candidates are: Foo<T>::Foo(const char *, std::vector<const char *,
    std::allocator<const char *> >&) [with T = float]

Однако, когда я изменил конструктор на

Foo(const char *name, std::vector<const char *> foos)

Все заработало как положено.Почему первый конструктор не работает?Я думал, что вектор может быть создан вместо вызова конструктора и передан по ссылке, но, очевидно, есть некоторая проблема.Кто-нибудь может объяснить это?

Спасибо

Кстати.Я использую g ++ версии 4.4.5

РЕДАКТИРОВАТЬ: Благодаря правильным ответам ниже, я также нашел , почему я не могу сделать это .

Ответы [ 6 ]

7 голосов
/ 10 июня 2011

Вы не можете привязать временное к T&.

Вы можете привязать временное к T const&:

Foo(const char* name, std::vector<const char*> const& foos)

Но я бы спросилздравомыслие vector из char указателей.Что не так с std::string?

3 голосов
/ 10 июня 2011

Временное не может быть привязано к неконстантной ссылке, поэтому сделайте это:

2 голосов
/ 10 июня 2011

Я думаю, что список инициализаторов - это красное наследие. Вы пытаетесь привязать временную ссылку к неконстантной ссылке, что является незаконным. Попробуйте использовать константную ссылку.

Foo(const char *name, std::vector<const char *> const& foos)
1 голос
/ 10 июня 2011

std::vector<const char *> &foos является ссылкой lvalue. Вы пытаетесь передать значение, это неправильно. Вы можете использовать либо ссылку на значение std::vector<const char *> &&foos, либо ссылку на постоянную const std::vector<const char *> &foos

0 голосов
/ 13 июня 2011

У вас уже есть ответ, но, поскольку у вас есть «список инициализаторов» в заголовке, вы можете рассмотреть возможность написания (C ++ 0x) конструктора списка инициализаторов, например, так:

struct Foo {
    Foo(const char* name, std::initalizer_list<const char*> il)
      : name(name), buf(il)
    { }
private:
    const char * const name;
    std::vector<const char *> buf;
};

Тогда вы больше не агрегат, но вы можете построить его так:

Foo x("Name", { "ab", "cd", "ef" });

Вы даже можете передать il в качестве константной ссылки, если хотите.

0 голосов
/ 10 июня 2011

Нельзя связать r-значение std::vector с неконстантной ссылкой-значением. Вы должны взять постоянную ссылку или ссылку на значение.

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