Консистентное поведение return в конструкторах

yuyoyuppe
yuyoyuppe

Пример кода:

void log(...) { }

void func(const bool v)
{
    if(v) return log();
}

struct S
{
    S(const bool v)
    {
        // works!
        if(v) return;

        // error: constructor 'S' must not return void expression
        //if(v) return log();
    }
};

Из текущего стандарта http://eel.is/c++draft/class.ctor#6:

A return statement in the body of a constructor shall not specify a return value.

-2
рейтинг
core
4 комментария
Antervis

так это же ничего не дает. Конструкторы по определению не должны возвращать значение, поэтому return foo(); в конструкторах не имеет смысла даже если foo() возвращает void

Antervis
webreh

Antervis,
пример 1

if (condition) return InitPath1(); return InitPath2();

пример 2

const auto finish = [&] (int x) { value_ = x; };

if (condition) return finish(42);
return finish(0);
webreh
Обновлено 
Antervis

webreh, это всего лишь синтаксический сахар над

if (cond) {
    finish();
    return;
}

причем сахар для редкого юзкейса.

Antervis
oficsu

Мне кажется, что данная идея в чём-то схожа с этим предложения и вполне возможно, что могла бы стать его частью, кроме того, там уже затронут §6.6.3 The return statement:
A return statement with an operand of type void shall be used only in a function whose return type is cv void
Однако, я не уверен в том, как правильно интерпретировать данное изменение

 

oficsu
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения