c++ - {object} 的类型是什么?

标签 c++

考虑以下代码:

void foo (M&) {}

M m;
foo ({m});

因此,表达式 {m} 被视为右值引用,这就是此代码无法编译的原因。

{object} 总是生成临时对象,这是真的吗?

如果没有,那么如何确定它何时发生? 如果是,请考虑以下代码:

struct M {};

struct I {
    I (M&) {}
};

struct MM {
    MM (M& p)
    : m (p), i ( {p} )
    {}

    M& m;
    I i;
};

M m;
MM mm {m};

这里完全没有问题,那么第一个例子的{m}和第二个例子的{p}​​有什么区别呢?

编译器 (GCC 4.8.1) 结果(第一个示例):

main.cpp:366:13: error: invalid initialization of non-const reference of type ‘M&’ from an rvalue of type ‘<brace-enclosed initializer list>’
     foo ({m});
             ^
main.cpp:359:6: error: in passing argument 1 of ‘void foo(M&)’
 void foo (M&) {}

最佳答案

What is the type of {object}?

这取决于上下文。在某些情况下,例如使用 std::initializer_list 构造类型时参数,它将是 std::initializer_list<decltype(object)> 类型.在其他情况下,它将用于初始化聚合或其他类型的成员,在这种情况下语法形式为 {object} 本身没有类型

Is this true that {object} always produces temporary object?

不,在您的情况下不应该。这是 a bug in the C++11 spec与指定列表初始化的子句的顺序有关。旧的措辞意味着您的调用导致构造一个临时的(由于非 const 引用参数,它的格式不正确),但在新规则下,引用绑定(bind)到单个初始值设定项列表元素。您的旧编译器实现了旧的措辞,而 newer compilers实现固定行为。

Here there is no problem at all, so what is the difference between {m} from the first example and {p} from the second?

区别在于{m}用于初始化 M foo 的参数(在旧的措辞下无效),但是 {p}初始化 I成员。因此,p被视为 I 的参数构造函数,绑定(bind)到 M&参数,并且自 p是一个左值,一切都很好。

关于c++ - {object} 的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40784322/

相关文章:

c++ - Qt Creator - 无法将信号连接到插槽(没有匹配的调用功能)

c++ - Windows 操作系统的 strerror_r 的替代 api

c++ - 什么时候需要从函数返回引用?

c++ - 使用默认参数的模板参数推导行为

c++ - 将 std::vector<char> 转换为 char* 会导致有缺陷的字符

C++/OpenGL - 开始一个新项目

c++ - 动态类型取消引用?

c++ - 在允许并行性的情况下用 STL 算法替换 for 循环

c++ - 从 jpeg 内存缓冲区创建 HBITMAP?

c++ - GNU GMP 中 mpz_class 的 sizeinbase