Я наткнулся на это, пытаясь очистить временную переменную.Это казалось достаточно интересным для обсуждения.
ArrayType m_ArrayOfThings;
INT32 m_BitfieldOfThings;
...
// Assume MyType has a ctor overload with argument ArrayType and another with int32.
const MyType my_obj( m_ArrayOfThings.IsEmpty() ? m_BitfieldOfThings : m_ArrayOfThings )
Вот упрощенный пример моей установки.Нечто подобное можно найти в конструкторах FCollisionObjectQueryParams
UE4.
Компиляция выше приведёт к
error C2446: no conversion from 'INT32' to 'ArrayType'
, так как переданный тип неизвестен во время компиляции.
auto temp = m_ArrayOfThings.IsEmpty() ? m_BitfieldOfThings : m_ArrayOfThings;
const MyType my_obj( temp );
Это также выдаст: error C3536: 'temp': cannot be used before it is initialized
.
Очевидно, что нужно преобразовать любую переменную, чтобы иметь совпадающие типы, поэтому тип известен во время компиляции, однако мне было интересно, существует ли семантика, хитрости /хаки или новые функции (c ++ 17 и т. д.) , чтобы решить эту проблему.