Рассмотрим следующий фрагмент кода:
template <typename>
struct dependent_false { static constexpr auto value = false; };
struct foo
{
foo() { }
template <typename T>
foo(const T&) { static_assert(dependent_false<T>::value, ""); }
};
struct proxy
{
operator foo() { return foo{}; }
};
int main()
{
(void) foo{proxy{}};
}
При компиляции с -std=c++17
:
При компиляции с -std=c++11
оба компилятора отклоняюткод.Новые правила материализации prvalue в C ++ 17 могут повлиять на поведение здесь.
живой пример на godbolt.org
Какое здесь правильное поведение?
Гарантирует ли Стандарт, что foo::foo(const T&)
будет (или не будет) создан?
Гарантирует ли Стандарт, что оператор неявного преобразования предпочтительнее вызова foo::foo(const T&)
, независимо от того, был ли он создан?