考虑以下代码片段:
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&),无论它是否被实例化?