LINUX.ORG.RU

Вопрос по синтаксису в C++

 


0

1

Есть функция на подобие:

someFunction(QPointF, QPointF);
Насколько правильно писать так:
someFunction({1, 2}, {0.4, 122});
?

Чем этот вызов отличается от:

someFunction(QPointF(1, 2), QPointF(0.4, 122));
?

Есть ли разница для компилятора и что это за фишка такая(передача параметра как списка для инициализации типа)?
Это в C++11 появилось?

★★★★★
Ответ на: комментарий от deterok

Зато можно структуру инить при передаче.

struct Some 
{
  int a;
  int b;
  int c;
};
...............
void func (const Some &some);

...............
func ({1, 2, 3});

panter_dsd ★★★★
()

Чем этот вызов отличается

Тем, что он менее понятен, если, к примеру, там будет несколько параметров разных типов. А в данном конкретном случае, скорее, менее понятен второй способ.

buddhist ★★★★★
()

Передать списки инициализации не получится, если конструктор QPointF будет объявлен как explicit. В остальном разницы нет.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

Передать списки инициализации не получится, если конструктор QPointF будет объявлен как explicit. В остальном разницы нет.

НЕ совсем понял что ты хотел сказать, explicit рулит только для конструктора с одним параметром.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

В старом стандарте - может быть. В новом explicit действует при использовании списков инициализации, столкнулся с этим ещё год назад при работе с векторами из 2, 3, 4 координат в трассировщике лучей; с тех пор зарёкся использовать неявные конструкторы и операторы приведения к неконстантным типам. Вот минимальный пример:

#include <string>

class Delight
{
public:
    Delight(int a, std::string b)
        : a(a)
        , b(b)
    {
    }

    explicit Delight(int a, std::string b, std::string c)
        : a(a)
        , b(b + c)
    {
    }

private:
    int a;
    std::string b;
};

void foo(const Delight&)
{
}

int main()
{
    foo({10, "horosho"}); /// correct
//    foo({10, "horosho", "uspeh"}); /// error
}

quiet_readonly ★★★★
()
Последнее исправление: quiet_readonly (всего исправлений: 1)
Ответ на: комментарий от quiet_readonly

Передать списки инициализации не получится, если конструктор QPointF будет объявлен как explicit. В остальном разницы нет.

да точно, я провтыкал. Здесь же этот initializer_list и будет «одним» параметром.

Boy_from_Jungle ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.