C++ 构造函数未返回可用对象

C++ 构造函数未返回可用对象,c++,most-vexing-parse,C++,Most Vexing Parse,我对构造函数有一个问题,它不能像我期望的那样工作 如果我尝试这样初始化我的类,它会工作,我会得到一个可用的对象: vector<float> v; MyClass<2> a(v); 向量v; 我的a级(v级); 然而,如果我尝试构建一个如下所示的类(应该是等效的),结果是出乎意料的。编译或运行程序时没有错误消息/警告。但如果您尝试在某处使用此变量a并调用其方法(例如a.doSomething()),它将崩溃 我在构造函数中放了一些代码来通知我是否使用了它。事实证明,在

我对构造函数有一个问题,它不能像我期望的那样工作

如果我尝试这样初始化我的类,它会工作,我会得到一个可用的对象:

vector<float> v;
MyClass<2> a(v);
向量v; 我的a级(v级); 然而,如果我尝试构建一个如下所示的类(应该是等效的),结果是出乎意料的。编译或运行程序时没有错误消息/警告。但如果您尝试在某处使用此变量a并调用其方法(例如a.doSomething()),它将崩溃

我在构造函数中放了一些代码来通知我是否使用了它。事实证明,在本例中,构造函数中没有实际执行任何代码

MyClass<2> a(vector<float>());
MyClass a(vector());
所以我想知道为什么会这样?第二次申报是否违法

编辑:我将发布一些类的代码

template <int x>
class MyClass {
public:
    vector<float> v;
    MyClass<x>(vector<float> v1) {
      v = v1;
    }

};
模板
类MyClass{
公众:
向量v;
MyClass(向量v1){
v=v1;
}
};
或者,您可以使用复制初始化:

MyClass<2> a = MyClass<2>(vector<float>());
(尽管如此,除非您希望
vector
对象隐式转换为
MyClass
对象,否则您可能希望使此构造函数
显式


一个好的编译器应该警告你这类事情。Visual C++警告:

警告C4930:“
MyClass a(std::vector(uu cdecl*)(void))
”:未调用原型函数(是否使用变量定义?)

叮当声警告:

警告:括号作为函数声明符已消除歧义

MyClass<2> a(vector<float>());
            ^~~~~~~~~~~~~~~~~
MyClass a(vector());
^~~~~~~~~~~~~~~~~

该类具有相同类型的公共变量。所以它只会将参数赋值给变量。我发布了一些类的代码。它不是一个引用或指针,只是一个变量。不明白为什么myclassPost的代码使用向量(并导致错误)为什么MyClassA((vector())?这不应该与MyClass a(vector())相同吗?@BlackBear:使用额外的圆括号,它不是有效的函数声明,因此它被解析为带有直接初始值设定项的变量声明。是的,添加额外的圆括号确实可以使它工作。谢谢!叮当声错误诊断功能非常强大+1用于发布Clang的错误消息。:)
MyClass<2> a = MyClass<2>(vector<float>());
MyClass<2> a = vector<float>();
MyClass<2> a(vector<float>());
            ^~~~~~~~~~~~~~~~~