c++ - 调用正确的构造函数

标签 c++ templates constructor

我有一个类 X,其两个构造函数定义如下:

template <typename T>
class X {
  template <typename U>      
  X(U& u) {
   // some logic
  }

  X(const Y<T>& y) {
    // some other logic
  }
};

类 Y 有一个静态方法,它返回类型 Y 的对象。

template <typename T>
class Y {
  static Y<T> myStaticMethod(const T& t) {
    // some logic
  }
};

现在,如果我尝试使用以下代码:

const Y<double>& obj = Y<double>::myStaticMethod(1.0);
X<double> xObj = new X<double>(obj);

使用双模板 T 和 U 的构造函数被调用,T = double 这是预期的,但 U = Y<double>*这是相当出乎意料的。

我希望 X 的第二个构造函数被调用,但它没有发生。另外,为什么当我使用引用调用构造函数时,obj 会转换为指针?

最佳答案

考虑你的路线:

X<double> xObj = new X<double>(obj);

这告诉编译器获取新表达式的结果,并且 将它们转换为 X<double> 。新结果的类型 表达式为X<double>* ; X<double> 的唯一构造函数哪个 可以用指针调用的是 template <typename T> X:X(U& ) 。 除了它也不能被调用,因为它需要绑定(bind) 非常量引用的右值。但有些编译器被破坏了,并且 无论如何都允许它。

如所写,代码不应编译,但如果编译,则应调用 X<double> 的构造函数两次。

关于c++ - 调用正确的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22948496/

相关文章:

c++ - 如何验证 C++ 构造函数中的输入参数?

Angular4 在构造函数中调用一个函数

c# - 构造函数定义中的 ": base"是什么意思?

c++ - Variadic 模板候选者不匹配

c++ - 不应调用基类的复制构造函数

c++ - 分段故障多项式

c++ - 无法弄清楚为什么只从文件中读取一行矩阵以及为什么我不能将二维数组传递给函数

c++ - 内联 STL 类型列表管理器

c++ - 使用预编译头编译cpp

c++ - 用较新的 GCC 版本替换 GCC 的系统级 C++ 运行时是否安全?