C++ 正在传递构造函数';是否接受s参数作为类的实例?

C++ 正在传递构造函数';是否接受s参数作为类的实例?,c++,constructor,C++,Constructor,我偶然发现了这个案例(简化) 这在编译时没有任何关于如何将给定参数强制转换为类A的构造函数中的类B的实例的警告 class B{ public: B(int _x) { } virtual ~B() { } }; class A{ public: A(const B& source) { } virtual ~A() { } }; int main(){ new A(1); return

我偶然发现了这个案例(简化)
这在编译时没有任何关于如何将给定参数强制转换为类A的构造函数中的类B的实例的警告

class B{
    public:
        B(int _x) { }
        virtual ~B() { }
};

class A{
    public:
        A(const B& source) { }
        virtual ~A() { }
};

int main(){
    new A(1);
    return 0;
}
1.这是否被视为良好做法? <>我没有看到C++中的任何代码,当被请求一个实例/ const引用时,它给出构造函数的参数。这是一条潜规则吗

2.在没有警告和有警告的情况下,这在多大程度上是可能/允许的? 当函数原型要求(非
const
)引用时,这不起作用

3.编译器什么时候认为这比重载函数更好? 编译以下示例:

class B
{
    public:
        B(double _x = 0, double _y = 0) { }
        virtual ~B() { }
};

class A
{
    public:
        A(const B& source, int z = 0) {cout << "B class constructor";}
        A(double _x, double _y){cout << "primitive types";}
        virtual ~A() { }
};

int main()
{
    new A(1, 1);
    return 0;
}
(我知道编译器与int->double冲突)

但是当从
(const B&,int)
构造函数中删除
int z=0
参数时,警告消失(仍然打印“
基本类型”
”)
在我看来,这是更加模糊的

模糊性是如何决定的

  • 这是否被视为良好做法
  • <>我没有看到C++中的任何代码,当被请求一个实例/ const引用时,它给出构造函数的参数。这是一条潜规则吗

    “提供构造函数的参数”是没有意义的。这里发生的事情是,通过为此目的提供的构造函数,从一个
    double
    构造一个
    const B
    对象。没有比这更神秘的了。它实际上是一个简单的类型化操作,如果在传递参数或返回值时可用,则C++编译器将始终考虑单步类型转换。
  • 在没有警告和有警告的情况下,这在多大程度上是可能/允许的
  • 在某种程度上,它可以在一个单一的步骤没有歧义

    当函数原型请求(非常量)引用时,这不起作用

    这是因为编译器不能用C++的规则构造一个非const临时对象。

  • 编译器什么时候认为这比重载函数更好? ... 在我的选择中,哪一个更加模糊
  • 事实并非如此

    歧义是如何解决的


    没有含糊不清的问题需要解决。C++中没有规则表示它应该试图从两个或更多个参数构造一个单一的代码> const b< /Case>对象。

    你在C++的教科书上读过这个吗?“我没有看到C++中的任何代码,当被请求一个实例/ const引用时,它给出了构造函数的参数。”这个语句是没有意义的。这里没有这样做的代码,也没有“givestheconstructors参数”的语法,也没有我能看到的任何含义。您在这里看到的只是一个普通的类型转换,由
    常量
    实现。About(1):它没有什么不好的。你会调用voidfoo(conststd::string&s){}
    foo(“123”)坏习惯?About(2):它不适用于非常量引用,因为它们不能绑定到临时引用,并且您在那里进行的隐式转换会生成临时引用。关于(3):向上看。关于警告:它消失了,因为在
    新的A(1,1)
    中有两个参数,而您只有一个带两个参数的构造函数。@EJP:您引用的语句的意思是“我没有看到使用转换构造函数初始化参数的调用。”。如果你看过很多代码,这并不是真的。@Davidsherring我知道这里发生了什么,谢谢,他不是这么说的,他所说的毫无意义。这里的大部分问题是OP的非凡语言。
    warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
    note: candidate 1: A::A(double, double)
    note: candidate 2: A::A(const B&, int)