gpt4 book ai didi

C++ 在带有右值缓冲区的 ostream 中使用 snprintf,格式是否正确?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:40 25 4
gpt4 key购买 nike

我想知道我是否可以在 ostream 中使用 snprintf 格式,这样我就可以在流表达式本身中嵌入对 snprintf 的调用.这在 GCC 4.9 中编译,但是可以吗?

    cout << [](char (&&buf) [12], int d) { snprintf(buf, 12, "%d", d); return buf; } ({ }, 15) << endl;

最佳答案

这是格式正确且定义明确的。 {} 用于复制列表初始化对 char [12] 的右值引用,它创建一个临时 char [12] 数组以引用是绑定(bind)的。这个临时值一直存在到完整表达式的末尾 - 在本例中,直到分号,因此可以安全地返回指向数组中元素的指针并用于在该表达式中打印。 (lambda 返回一个 char * 指向这个数组的第一个元素。)

标准语:

§8.5 [dcl.init]/p17:

The semantics of initializers are as follows. [...]

  • If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized (8.5.4).

§8.5.4 [dcl.init.list]/p3:

List-initialization of an object or reference of type T is defined as follows:

  • [...]
  • Otherwise, if T is a reference type, a prvalue temporary of the type referenced by T is copy-list-initialized or direct-list-initialized, depending on the kind of initialization for the reference, and the reference is bound to that temporary. [ Note: As usual, the binding will fail and the program is ill-formed if the reference type is an lvalue reference to a non-const type. —end note ]

§12.2 [class.temporary]/p5:

A temporary bound to a reference parameter in a function call (5.2.2) persists until the completion of the full-expression containing the call.

关于C++ 在带有右值缓冲区的 ostream 中使用 snprintf,格式是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27237423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com