Примеры, где я видел это:
std::cout << std::plus<>{}(a, b) << '\n';
в вопросе Вот.
std::hash<T>{}(54879)
И другие, я не могу найти их прямо сейчас.
я знаю это object{}
или же object()
вызывает ctor по умолчанию и object{val}
или же object(val1,val2)
вызывает конструктор с параметрами А также object<>{}
или же object<T>()
явно указывает любой тип (ы) параметра (ов) для объекта. Но что это значит, когда все они используются вместе? Я не могу найти статью или веб-страницу, объясняющую это, либо я могу что-то упустить. Что это?
То, что вы видите, — это создание временного функтора просто для вызова его оператора вызова функции.
Предполагая, что класс перегружен оператором вызова функции:
template<typename T>
struct myclass {
int operator()(int arg1, int arg2);
};
Тогда фрагмент x = myclass<SomeType>{}(val1, val2);
делает следующие вещи:
myclass<SomeType>
вызывая конструктор по умолчанию из-за универсального инициализатора {}
,operator()
на этот временный объект, в этом случае поставка val1
а также val2
в качестве аргументовВместо этого можно было бы написать следующий эквивалентный код:
{
auto obj = myclass<SomeType>{}; // initialize object
x = obj(val1, val2); // invoke operator()
}
Это полезно, например, если вы хотите вычислить хеш объекта, используя std::hash
но не хочу, чтобы экземпляр std::hash
жить долго.
Других решений пока нет …