相关疑难解决方法(0)

关于最令人烦恼的解析的令人困惑的细节

我的问题是如何将以下行解析为函数声明:

vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());
Run Code Online (Sandbox Code Playgroud)

我理解Most Vexing Parse的大部分细节以及为什么第二个临时迭代器可以被解释为一个返回迭代器并且不带参数的函数的类型,但是我没有得到的是为什么第一个临时迭代器可以是解释为一种类型.它代表什么类型?我的想法是它会是某种函数类型,但我看不出名称是如何cin被使用的.它是否声明该参数是一个istream_iterator<int>名为cin?如果是这样,这是否意味着您可以任意地将函数的参数名称括起来?如果是这样,为什么?

c++ most-vexing-parse

15
推荐指数
4
解决办法
1990
查看次数

构造函数被解释为函数调用,并且直接跳过了构造函数

我有一个包含4个构造函数的类,函数如下:

using namespace std;

class ABC {
public:
    ABC() {
        cout << "ABC()\n";
    }

    ABC(int) {
        cout << "ABC(int)\n";
    }

    ABC(ABC&) {
        cout << "ABC(&)\n";
    }

    ABC(ABC&&) {
        cout << "ABC(&&)\n";
    }
};


void ff(ABC t) { }
Run Code Online (Sandbox Code Playgroud)

请帮我解释一些对我来说很奇怪的行为(我使用MSVC 2016进行编译):

1)为什么我收到警告C4930:"'ABC a1(ABC(__ cdecl*)(void))':未调用prototyped函数(是一个变量定义?)",使用以下代码:

void main() {
    ABC a1(ABC());
    ff(ABC(5));
}
Run Code Online (Sandbox Code Playgroud)

在执行时,我希望得到以下输出:

ABC()
ABC(&&)
ABC(int)
ABC(&&)
Run Code Online (Sandbox Code Playgroud)

但我真正得到的是

ABC(int)
Run Code Online (Sandbox Code Playgroud)

2)现在,如果我改为

void main() {
    ABC a1(ABC(5));
    ff(ABC(5));
}
Run Code Online (Sandbox Code Playgroud)

没有更多的警告.但在执行时,我期望得到的是

ABC(int)
ABC(&&)
ABC(int)
ABC(&&)
Run Code Online (Sandbox Code Playgroud)

但我真正得到的是

ABC(int)
ABC(int)
Run Code Online (Sandbox Code Playgroud)

3)现在

void main() {
    ABC( ABC() ); …
Run Code Online (Sandbox Code Playgroud)

c++ constructor most-vexing-parse move-constructor

2
推荐指数
1
解决办法
100
查看次数