gpt4 book ai didi

c++ - 编译器如何选择自动类型转换方法

转载 作者:行者123 更新时间:2023-11-30 04:00:17 24 4
gpt4 key购买 nike

在这段代码中,使用了两个方法来允许将 Y 对象转换为 X 对象。通过 g++ 编译总是选择构造函数。如果构造函数是私有(private)的,例如:
private : Y(const X&){std::cout << "Y constructor...\n" ; }
运算符或构造函数会阻止转换。如果构造函数是私有(private)且显式的
private : explicit Y(const X&){std::cout << "Y constructor...\n" ; }
编译器改用运算符。这是通过将转换构造函数设为私有(private)来防止自动转换的常用方法吗?编译器用于进行此类转换的规则是什么。

#include <iostream>

class Y ;

class X {
public:
operator Y()const ;
};

class Y {
public:
Y(){}
private :
explicit Y(const X&){std::cout << "Y constructor...\n" ; }
};

X::operator Y() const { std:: cout << "Operator Y...\n" ;
return Y ();
}


void func(Y Y_object) {}

int main() {
X X_object ;
Y Y_object ;

func(X_object) ;
Y_object = X_object ;
}

最佳答案

转换函数和转换构造函数指定从转换函数/构造函数所针对的类型到参数中采用的类型的转换。换句话说,您正在从 X 转换为 Y,而不是您所说的相反。

当存在从XY 的转换时,编译器会通过函数重载决议考虑可能的最佳转换。由于在重载决议期间不考虑访问控制,如果私有(private)转换更可行,则有可能选择私有(private)转换而不是公共(public)转换。如果两个转换同样可行,则它们之间也可能存在歧义。


调用函数 func(X_object) 需要从 XY 的隐式转换。考虑到 X::operator Y() const 和转换构造函数 explicit Y::Y(const X&),选择转换运算符是因为构造函数被标记为 explicit 因此只能通过直接初始化语法或显式转换调用。

func(Y(X_object));
func(static_cast<Y>(X_object));

它们都调用显式转换构造函数,因为构造函数的参数类型和参数完全匹配。


当使用复制赋值将 X 隐式转换为 Y 时,也会出现同样的情况。隐式转换运算符是比显式构造函数更可行的函数:

Y_object = X_object; // calls X_object.operator Y()

如果使用直接初始化语法或显式转换,则转换构造函数将是最佳可行函数。


为了防止从 XY 的隐式转换,最好给 Y 一个显式构造函数而不是一个显式转换运算符。在这种情况下,似乎没有理由将构造函数设为私有(private),除非您想一起阻止转换,但如果您想这样做,则只需不声明构造函数即可。

关于c++ - 编译器如何选择自动类型转换方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26408312/

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