object — Что означает этот синтаксис std :: class & lt; & gt; {} (arg1, arg2) в C ++?

Примеры, где я видел это:

std::cout << std::plus<>{}(a, b) << '\n'; в вопросе Вот.

std::hash<T>{}(54879)

И другие, я не могу найти их прямо сейчас.

я знаю это object{} или же object() вызывает ctor по умолчанию и object{val} или же object(val1,val2) вызывает конструктор с параметрами А также object<>{} или же object<T>() явно указывает любой тип (ы) параметра (ов) для объекта. Но что это значит, когда все они используются вместе? Я не могу найти статью или веб-страницу, объясняющую это, либо я могу что-то упустить. Что это?

1

Решение

То, что вы видите, — это создание временного функтора просто для вызова его оператора вызова функции.
Предполагая, что класс перегружен оператором вызова функции:

template<typename T>
struct myclass {
int operator()(int arg1, int arg2);
};

Тогда фрагмент x = myclass<SomeType>{}(val1, val2); делает следующие вещи:

  1. Это создает временный объект типа myclass<SomeType> вызывая конструктор по умолчанию из-за универсального инициализатора {},
  2. Затем звонит operator() на этот временный объект, в этом случае поставка val1 а также val2 в качестве аргументов
  3. Целое выражение возвращает результат оператора вызова функции, а временное уничтожается

Вместо этого можно было бы написать следующий эквивалентный код:

{
auto obj = myclass<SomeType>{}; // initialize object
x = obj(val1, val2); // invoke operator()
}

Это полезно, например, если вы хотите вычислить хеш объекта, используя std::hash но не хочу, чтобы экземпляр std::hash жить долго.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]