Сбой конструктора копирования С++

Я просмотрел различные варианты, предложенные в качестве вопросов, на которые, по мнению Stackoverflow, уже может быть ответ, но ничего из того, что я видел, не приблизилось.

Образец кода:

#include <math.h>

class v2
{
public:
    float x;
    float y;

    v2(float angle) : x(cos(angle)), y(sin(angle))          {}
    v2(const v2 &v) : x(v.x), y(v.y)                        {}
};

int main(int argc, char **argv)
{
    float const angle(1.0f);
    v2 const test1(angle);
    v2 const test2(v2(angle));
    v2 const test3(test1);

    float const x1(test1.x);
    float const y1(test1.y);

    float const x2(test2.x);                // These two lines fail, claiming left of .x must have class type.
    float const y2(test2.y);

    float const x3(test3.x);
    float const y3(test3.y);

    return 0;
}

Это с MSVC из VS 2010. Создание test2 компилируется правильно, но доступ к его членам завершается ошибкой, утверждая, что test2 не имеет типа класса.

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

Так в чем причина ошибки?


person dgnuff    schedule 14.09.2015    source источник
comment
используйте v2 const test2((v2(angle))); для устранения неоднозначности   -  person Marco A.    schedule 14.09.2015
comment
Имейте в виду, что в этом случае вам не нужно предоставлять собственный конструктор копирования.   -  person Neil Kirk    schedule 14.09.2015
comment
Наконец, вопрос о фактическом самом надоедливом разборе!!!   -  person Lightness Races in Orbit    schedule 14.09.2015


Ответы (2)


Компилятор считает, что test2 — это функция! Прочтите о самом сложном синтаксическом анализе.

Вы можете решить это с помощью любого из этих двух:

v2 const test2((v2(angle)));  // before C++11

v2 const test2{v2(angle)};    // C++11 uniform initialization
person Manos Nikolaidis    schedule 14.09.2015

Вы стали жертвой самого неприятного синтаксического анализа. В своем коде вы объявили test2 как функцию. Один из способов исправить это — добавить дополнительный набор скобок: v2 const test2((v2(angle)));.

person MooseBoys    schedule 14.09.2015