C++ 对象创建或函数原型(prototype)声明

标签 c++ gcc

今天一个奇怪的 C++ 编译器行为让我感到惊讶。

class Foo {
    friend ostream& operator << (ostream& os, const Foo& rhs)
    {
       return os << sizeof(rhs) <<  endl;
    }
};

struct Bar { };

int main()
{
    Foo f(Bar());
    cout << f;
    return 0;
}

显然,上面的代码编译得很好,即使没有

Foo(const Bar&); 

c'tor 定义。使用 -Wall 编译表明编译器解释了表达式

Foo f(Bar());

作为函数的原型(prototype)

Foo f(Bar (*)())

而不是用于创建 Foo 类型对象的表达式。

这里真正的陷阱(规则)是什么??

最佳答案

Foo f(Bar());

这里编译器假设是一个函数调用,作为 C++“最令人烦恼的解析”的结果。

你所能做的就是在你的对象周围再放一个括号。

Foo f((Bar()));

如果您查看 C++11 文档,则有更多方法可以避免这种行为。

关于C++ 对象创建或函数原型(prototype)声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26927486/

相关文章:

c++ - "Variable shadowed"lambda 中的警告(未捕获时)

c++ - Gold 所描述的 C++ "Key Function"是什么?

c - 输入使用 gets 不起作用,但使用 scanf

c++ - 这些是 std::enable_if 的预期错误,还是我使用不当?

c++ - vector 类型 String 但当用整数初始化时

c++ - 如何使用 LuaBridge 注册从同一个类继承的两个类?

c++ - 析构函数删除 main 中声明的动态数组

java - 如何获取字符串的所有子序列组合(在 Java 或 C++ 等中)

c++ - C++ 容器是异常安全的吗?

使用 malloc 或堆栈的 C sprintf 函数