【发布时间】:2023-03-10 15:23:01
【问题描述】:
考虑以下代码sn-p:
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++(主干)无法编译代码 - 它实例化了foo(const T&)。
使用-std=c++11 编译时,两个编译器都会拒绝该代码。 C++17 中新的 prvalue 物化规则可能会影响这里的行为。
这里的正确行为是什么?
标准是否保证
foo::foo(const T&)将被(或不被)实例化?标准是否保证隐式转换运算符将优先于
foo::foo(const T&)的调用,无论它是否被实例化?
【问题讨论】:
标签: c++ language-lawyer c++17 copy-elision conversion-operator