gpt4 book ai didi

c++ - 为什么我可以阻止基元的隐式转换而不是用户定义的类型?

转载 作者:行者123 更新时间:2023-11-30 01:40:08 27 4
gpt4 key购买 nike

高完整性 C++ 标准建议可以删除函数的右值参数,从而防止隐式转换。

http://www.codingstandard.com/rule/8-3-4-define-delete-functions-with-parameters-of-type-rvalue-reference-to-const/

我发现原始类型和用户定义类型的行为非常不同。

struct A { };

struct B { B(const A& ) {} };

template <class T>
void foo(const T&&) = delete; // 1 - deleted rvalue overload. const intentional.

void foo(B) {} // 2

void foo(int) {} // 3

int main(int argc, char* argv[])
{
A a;
foo(a); // This resolves to 2
foo(3.3); // This resolves to 1
foo(2); // This resolves to 3 (as expected).
}

为什么已删除的右值重载会阻止隐式转换为 int 而不是从一种用户定义类型到另一种类型?

最佳答案

The High Integrity C++ Standards suggest that rvalue arguments to functions can be deleted thus preventing implicit conversions.

不,只有转发引用 过载禁用ICS (Implicit Conversion Sequence)对于重载集中的所有其他重载。将其设为转发引用,see ICS disabled (Coliru Link)

template <class T>
void foo(const T&&) = delete; // introduces a qualification match

以上代码为重载添加了限定匹配。因此,ICS 仍在发挥作用。

为什么 foo(3.3)失败是因为3.3double 类型的纯右值与转换为 int 相比,这将更好地匹配右值重载.因为资格赛ranked better转化匹配

关于c++ - 为什么我可以阻止基元的隐式转换而不是用户定义的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43989414/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com