Я ищу объяснение следующего наблюдения.Начиная с vs2017 короткий код, о котором идет речь, читается следующим образом:
#include <iostream>
class Range
{
public:
double min = 0; // some default values here
double max = 1;
double getRange() const {return max-min;};
};
Range makeRange(double a, double b)
{
return {a,b}; // the initializer list return in question
}
int main()
{
const auto x = makeRange(4.0,5.0); // some example application
std::cout << x.min << ", " << x.max << std::endl;
}
. В этом случае класс Range предоставляет значения по умолчанию для «min» и «max» и может быть инициализирован списком инициализаторов из «makeRange».,Этот код компилируется и работает в VS2017.
В VS2015 он не компилируется (ошибка C2440: «возврат»: невозможно преобразовать «список инициализаторов» в «диапазон»).Однако, если значения по умолчанию удаляются так, что
class Range
{
public:
double min;
double max;
double getRange() const {return max-min;};
};
, он компилируется и работает в vs2015.Это все еще будет компилироваться в VS2017.Тем не менее, значения по умолчанию не определены (я думаю).Как только конструктор добавлен так, что есть значения по умолчанию
Range():min(0),max(0){};
, компиляция в VS2017 завершится неудачно.Итак, есть два вопроса по этому поводу:
- Я предположил, что списки инициализаторов, поддерживаемые VS2015.Почему первый код не компилируется в VS2015?Почему это происходит при удалении значений по умолчанию?
- Почему определение конструктора по умолчанию разрушает функциональность списка инициализатора в VS2017?Настройки по умолчанию у самих участников явно работали.