Код, приведенный ниже, дает «Результат операции мусор или неопределенный» в анализаторе Clang, но только когда инициализация выполняется с помощью фигурных скобок.Это происходит с std = c ++ 17, но не с версиями ниже 17. Если посмотреть на проводник компилятора, выходные данные одинаковы как для фигурных скобок, так и для скобок.
Это похоже на ложное срабатывание илиэто не так?
#include <iostream>
//////////////////////////////////////////////////////////////////////////////
// build with:
// scan-build -o results/scan-build --status-bugs clang++ -std=c++17 main.cpp
template<typename ValueType>
struct Enumeration
{
Enumeration() = delete;
Enumeration(const ValueType& value) : value_(value)
{
std::cout << "Enumeration ValueType ctor" << std::endl;
}
ValueType value_;
};
enum class Literal
{
NullType,
UndefinedType
};
struct DataType : Enumeration<Literal>
{
DataType () = delete;
DataType(Literal literal) : Enumeration<Literal>(literal)
{
std::cout << "DataType Literal ctor" << std::endl;
}
DataType(const DataType& dt) : Enumeration<Literal>(dt.value_)
{
std::cout << "DataType copy ctor" << std::endl;
}
DataType(const DataType&& dt) : Enumeration<Literal>(dt.value_)
{
std::cout << "DataType copy ctor" << std::endl;
}
inline bool operator==(const Literal& lit) const
{
return value_ == lit;
}
};
DataType getDataType()
{
DataType retval{Literal::UndefinedType};
std::cout << "getDataType(): constructed" << std::endl;
return retval;
}
int main(int, char**)
{
const DataType type{getDataType()}; // <- gives garbage error
//const DataType type(getDataType()); // <- no garbage error
if (type == Literal::UndefinedType) {
return 1;
}
return 0;
}