C++ C++;编译器错误:";无法在初始化中将std::list(*)转换为std::list*;

C++ C++;编译器错误:";无法在初始化中将std::list(*)转换为std::list*;,c++,g++,C++,G++,假设以下代码: std::list<Test1> l1(); std::list<Test1> *pl1 = &l1; std::list l1(); 标准::列表*pl1=&l1; 编译器给出一个错误(缩短了一点):无法在初始化时将std::list(*)转换为std::list* 当l1在没有括号的情况下初始化时,一切正常。这里的问题是什么?我如何避免它?正如您所写,l1是一个函数的声明不带参数并返回std::list。想象一下,如果名字不同,这可能更容易

假设以下代码:

std::list<Test1> l1();
std::list<Test1> *pl1 = &l1;
std::list l1();
标准::列表*pl1=&l1;
编译器给出一个错误(缩短了一点):
无法在初始化时将std::list(*)转换为std::list*


当l1在没有括号的情况下初始化时,一切正常。这里的问题是什么?我如何避免它?

正如您所写,
l1
是一个函数的声明不带参数并返回
std::list
。想象一下,如果名字不同,这可能更容易接受

std::list<Test1> make_tests(); // cleary a function declaration, no?
std::list<Test1> l1(); // also a function declaration
std::list<Test1> l1; // can't be a function declaration, no ()
std::list<Test1> l1{}; // also can't be a function declaration

据我所知,l1()实际上被解释为一个方法指针。saying=std::list();解决了这个问题。为什么模板类型会有不同的处理方式?这与模板无关,几乎是@UnholySheep,最令人烦恼的解析是关于使用临时变量的函数调用。@RyanHaining哦,我不知道-这里有不同的名称来描述这种情况吗(没有临时变量)?@UnholySheep我不知道,但是很可能有isaah,因为inline-its仍然被理解为链接器链接的函数声明(?)gotcha:)@Zain在你的例子中,它没有到达链接器,但是如果你调用它,那么链接器会寻找它。这就是我的意思,因为这就是这种声明的正确用法^_^
std::list<Test1> l1 = std::list<Test1>();
std::list<Test1> make_tests(); // according to your rules, should be a variable

int main() {
    std::list<Test1> tests = make_tests();
}

std::list<Test1> make_tests() {
    // ... function body ...
}
std::list<Test1> l1{};