是否接受将构造函数的参数作为类的实例传递?
Is passing the constructor's parameters as an instance of the class accepted?
>我遇到了这种情况(简化(
这在编译时没有任何警告,说明它似乎如何将给定参数强制转换为类 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++中看到任何代码在要求实例/常量引用时给出构造函数的参数。这是潜规则吗?
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;
}
给出警告(使用某些编译器选项(:
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)
(我知道编译器与int->double(冲突(
但是当从(const B&, int)
构造函数中删除int z = 0
参数时,警告消失(并且仍然打印"primitive types
"(,
在我看来这更加模棱两可。
歧义是如何决定的?
- 这被认为是好的做法吗?
我没有在C++中看到任何代码在要求实例/常量引用时提供构造函数的参数。这是潜规则吗?
"给出构造函数的参数"是没有意义的。这里发生的情况是,const B
对象是通过您为此目的提供的构造函数从double
构造的。没有什么比这更神秘的了。它实际上是一个简单的类型转换操作,如果单步类型转换在传递参数或返回值时可用,C++编译器将始终考虑单步类型转换。
- 在没有警告和警告的情况下,这在多大程度上是可能的/允许的?
在某种程度上,可以在一个步骤中没有歧义。
当函数原型请求(非常量(引用时,这不起作用。
这是因为编译器不会根据C++规则构造非常量临时对象。
编译器
- 什么时候认为这比重载函数更好? ...在我的选择中,这要模棱两可得多
其实不然。
如何解决歧义?
没有模棱两可的问题需要解决。C++中没有规则说它应该尝试从两个或多个参数中构造单个const B
对象。
相关文章:
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 将可变参数函数的参数封装在类实例中
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- std::vector 没有重载函数的实例与参数列表匹配
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 如何在模板函数中实例化其长度使用模板参数的数组
- 函数在可变参数模板的实例化期间不可见
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 实例化模板时,我是否必须显式显示参数包中的类型?
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 如何使用参数声明实例?
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 从模板参数包实例化的访问类实现
- C++ 可变参数模板实例化深度超过最大值 900
- 特征实例作为不同特征的模板参数
- 与参数匹配的友元模板函数实例化
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- c++ STL容器.为每个不同的实例参数化比较器
- 带有新实例参数的c++ 11委托构造函数