Есть ли какие-либо ограничения при передаче значения r конструктору? - PullRequest
3 голосов
/ 27 ноября 2011

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

class A {
};

class B {
    A a;
    public:
        B(A && _a) : a(_a) {}

        void test(){ }
};

int main(int argc, const char *argv[])
{
    B b(A());
    b.test();
    return 0;
}

но я получаю эту ошибку, которую не могу понять

$ g++ -std=c++0x main.cpp  
main.cpp: In function 'int main(int, const char**)': 
main.cpp:15:7: error: request for member 'test' in 'b', which is of non-class type 'B(A (*)())'

Возможно, это просто глупая синтаксическая ошибка, но если это не так, как бы вы определили такой конструктор для получения права собственности на какой-то созданный ресурс?

Спасибо

1 Ответ

3 голосов
/ 27 ноября 2011

Вы попали в то, что известно как самый неприятный синтаксический анализ C ++. Ваша линия

B b(A());

не не определяет объект b типа B, инициализированный временным объектом типа A, но объявляет функцию с именем b, принимающую неназванное аргумент функции типа (указатель на a) без аргументов и возвращающий A (таким образом, тип аргумента b объявляется как тип функции A() и затухает до указателя на тип функции A(*)() который вы можете увидеть в сообщении об ошибке), и возвращая B.

Самый простой способ - изменить эту строку на

B b = B(A());

В C ++ 11 лучшим вариантом является использование нового синтаксиса инициализатора и запись

B b { A() };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...