C++ C++;复制构造函数和类型转换

C++ C++;复制构造函数和类型转换,c++,templates,casting,type-conversion,copy-constructor,C++,Templates,Casting,Type Conversion,Copy Constructor,感谢您的帮助,我总结了以下解决方案 如果我错了,请纠正我 至少解释三件可能出错的事情 template<typename A, typename B, typename C> C mymin (const A& a, const B& b) { if ( a < b ) return (C) a; else return (C) b; } 模板 C mymin(施工A&A、施工B&B) { if(a

感谢您的帮助,我总结了以下解决方案

如果我错了,请纠正我

至少解释三件可能出错的事情

template<typename A, typename B, typename C>
C mymin (const A& a, const B& b)
{
  if ( a < b )
      return (C) a;
  else
      return (C) b;
}
模板
C mymin(施工A&A、施工B&B)
{
if(a
我的答案如下

请让我知道我是否得到了他们的权利

  • 未定义
  • A和B的类型可以不同,并且没有为此定义<运算符

  • 如果C的类型与a或B不同 ,类型转换会更改定义为常量的a或b

  • 不保证从A或B到C的类型铸造 ,因为未定义转换构造函数

  • 未定义A和B的复制构造函数。 因此,我们只是返回一个肤浅的复制。 因为它是肤浅的复制品 ,可以更改浅复制 ,并且应该是常量的原始副本也可以更改

  • 谢谢

    A和B的类型可以不同,并且没有为此定义<运算符

    这是不相关的,因为即使两种类型相同,也可能没有运算符<

    如果C的类型与a或B不同,则会发生类型转换,以更改定义为常量的a或B

    即使
    C
    相同,也会有常数损失

    不保证从A或B到C的类型转换,因为未定义转换构造函数

    类型转换本身是有保证的,但如果类型不同,则会产生不可预测的结果

    未定义A和B的复制构造函数。因此,我们只是返回一个肤浅的复制。因为它是一个浅拷贝,浅拷贝可以被改变,而原本应该是常量的拷贝也可以被改变


    A
    B
    不需要复制构造函数。唯一涉及的构造函数将是
    C
    的复制构造函数,它将接受已经是C样式的cast
    C
    作为参数。

    x
    y
    是否未声明?这段代码中有太多可能出错的地方,使得任何答案都没有意义。哦,对不起,我打错了。我纠正了。谢谢“G”类型的返回值也是打字错误吗?它是C.Soryy。我改正了。如果一些C++程序员来了,给你一个使用C样式的ChansSelp,怎么办?OTOH不,这将是正确的,而不是错误的。强制转换不会更改源对象,除非强制转换调用定义非常奇怪的
    操作符X
    或转换构造函数。此外,constness的缺乏不会影响源对象,除非
    C
    是引用类型(在有人“错误”使用结果引用之前,它仍然不会真正影响源对象)。@charlesbaily是的,它不会更改对象,因为它仅用于从cast提供的任何类型构造
    C
    的副本,我同意在这种情况下,康斯特内斯的损失并不重要。我的意思是,不管
    A
    是否与
    C
    相同,常数损失仍然会发生。哦,谢谢,那么这个问题的答案是什么。这就是我所能想到的。但大多数都是错误的……@asd213sasd2254121除了C风格的演员阵容,没有上下文很难分辨。我会投票赞成两者兼得的可能性