Zer*_*ero 4 c++ most-vexing-parse
我不明白以下问题.
class InnerBox
{
public:
    InnerBox() : mContents(123) { };
private:
    int mContents;
};
class Box
{
public:
    Box(const InnerBox& innerBox) : mInnerBox(innerBox) { };
private:
    InnerBox mInnerBox;
};
void SomeFunction(const Box& box)
{
    return;
}
int main()
{
    Box box(InnerBox());  // !!PROBLEM!! Doesn't work: compiler thinks this is a function declaration
    SomeFunction(box);    // Error, cannot convert 'function pointer type' to const Box&
    return 0;
}
完整的错误消息是(Visual Studio 2010)
 error C2664: 'SomeFunction' : cannot convert parameter 1 from 'Box (__cdecl *)(InnerBox (__cdecl *)(void))' to 'const Box &'
修复很简单:
int main()
{
    InnerBox innerBox;
    Box box(innerBox);  
    SomeFunction(box);
    return 0;
 }
这是一个MSVC特定的问题,如果没有,有人可以解释这种语言的怪癖阻止我打电话Box box(InnerBox());吗?
你需要把它写成:
Box box((InnerBox()));
要么
Box box{InnerBox()};
这不是MSVC特定的问题.C++中的规则是考虑任何可能是声明声明的构造.
如果没有附加的括号,代码就会声明一个函数,该函数box返回一个Box,其单个参数是一个指向函数的指针,该函数不带参数并返回一个InnerBox.(是 - InnerBox()实际上在函数参数中使用时声明了一个指向函数(未命名)的指针(这类似于在用作函数参数时Box[]实际声明指针的方式Box)).