Есть как минимум два варианта:
- Код недопустим, и Clang не сообщает о соответствующей ошибке.
- Код легален, и как GCC, так и MSVC содержат ошибку.
https://godbolt.org/z/qzc5zqb9W
template
struct B {
consteval B(T t) : m_t{ t } { };
template
operator B() const { return B(static_cast(m_t), typename B::private_ctor_tag{}); }
operator T() const { return m_t; }
private:
struct private_ctor_tag{};
B(T t, private_ctor_tag) : m_t{ t } { };
template
friend struct B;
T m_t;
};
struct A {
B b;
};
int main() {
constexpr B my_b{ 42 };
// okay on all compilers
A a0{ .b = my_b };
// okay only with clang. msvc and gcc give errors.
A a1{ .b{ my_b } };
A a2{ .b = { my_b } };
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ler-bug-or
Мобильная версия