SomeType var_name(); //я же просто хотел дефолтный деструктор вызвать, а не функцию объявлять.
add_custom_target(
openssl ALL
COMMAND perl ${PROJECT_SOURCE_DIR}/Configure ${TYPE} --prefix=${PROJECT_SOURCE_DIR}../openssl no-asm shared ${CONFIGURE_FLAGS}
COMMAND make
WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}")
Вы думаете что возвращаемый ей результат является r-value, но это не так, она возвращает l-value!
template <typename T>
decltype(auto) my_forward(T&& arg) // universal reference (can be rvalue- or lvalue-reference)
{
return static_cast<T&&>(arg);
}
template <typename T>
func (T&& foo)
{
auto&& foo1 = my_forward(foo); //lvalue
auto&& foo2 = my_forward(T()); // rvalue
// type of foo1 is Foo&
// type of foo2 is Foo&&
}
static_cast<T&&> = static_cast<Foo&&>
- каст к rvalue-ссылке. Тогда и тип возращаемого значения функции выведется как rvalue reference.static_cast<T&&> = static_cast<Foo& &&>
и по правилу сворачивания ссылок = static_cast<Foo&>
- каст к lvalue ссылке. Однако, эта функция позволяет вывести T& t в ситуации, когда этот тип не может быть выведен (согласно стандарту С++, 14.8.2.5), поэтому необходимо явно указывать параметры шаблона при вызове std::forward.