考虑以下代码片段:
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
:
clang++
(trunk) 成功编译代码;g++
(trunk) 无法编译代码 - 它实例化foo(const T&)
.
使用 编译时-std=c++11
,两个编译器都拒绝该代码。C++17 中新的纯右值具体化规则可能会影响此处的行为。
这里的正确行为是什么?
标准是否保证
foo::foo(const T&)
将(或不)实例化?标准是否保证隐式转换运算符将优先于 的调用
foo::foo(const T&)
,无论它是否被实例化?