使用初始化列表作为参数时的模糊性

时间:2014-11-05 05:03:10

标签: c++ c++11 eigen initializer-list

我对以下一段代码感到困惑:

#include <Eigen/Dense>
#include <vector>

class Foo {};

void f(Eigen::MatrixXd const &) {}
void f(std::vector<Eigen::MatrixXd> const &) {}

void g(Foo const &) {}
void g(std::vector<Foo> const &) {}

int main()
{
    Foo a, b, c;
    Eigen::MatrixXd x, y, z;

    // f({x, y}); ambiguity, why?!
    f({x, y, z}); // ok

    g({a,b}); // ok
    g({a,b,c}); // ok
}

如果我取消评论main()中的第3个代码行,则会出现模糊的调用错误,

/Users/vlad/so.cpp: In function 'int main()':
/Users/vlad/so.cpp:17:13: error: call of overloaded 'f(<brace-enclosed initializer list>)' is ambiguous
     f({x, y}); //ambiguity, why?!
             ^
/Users/vlad/so.cpp:17:13: note: candidates are:
/Users/vlad/so.cpp:6:6: note: void f(const MatrixXd&)
 void f(Eigen::MatrixXd const &) {}
      ^
/Users/vlad/so.cpp:7:6: note: void f(const std::vector<Eigen::Matrix<double, -1, -1> >&)
 void f(std::vector<Eigen::MatrixXd> const &) {}

在init列表中使用3个项目调用它。

但是,如果不使用Eigen矩阵,我使用自己的类Foo(参见函数g),一切正常。我完全不知道为什么使用Eigen时注释行是不明确的。有什么想法吗?

PS:如果我重载f以便它需要std::initializer_list<Eigen::MatrixXd>,那么问题就会消失,不会有更多模糊的调用。

1 个答案:

答案 0 :(得分:4)

错误很可能是由this constructor template引起的。

template<typename T0, typename T1>
EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE Matrix(const T0& x, const T1& y)
{ ... }

构造函数和vector的{​​{1}}构造函数在函数调用initializer_list中都是相同的匹配,导致模糊错误。

带有类似构造函数和函数调用的

Here's a made up example也会导致歧义错误。