C++使用带有rvalue缓冲区的ostream中的snprintf,这个格式是否良好?

Tho*_*eod 6 c++ arrays rvalue-reference c++11

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

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

T.C*_*.C. 7

这是良好的形式和明确的定义.{}用于copy-list-initialize一个rvalue引用char [12],它创建一个char [12]绑定引用的临时数组.这个临时值一直持续到完整表达式结束 - 在这种情况下,直到分号,因此可以安全地返回指向数组中元素的指针并用于在该表达式中打印.(lambda返回char *指向此数组的第一个元素.)

Standardese:

§8.5[dcl.init]/p17:

初始化器的语义如下.[...]

  • 如果初始化程序是(非括号的)braced-init-list,则对象或引用是列表初始化的(8.5.4).

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

对象或类型引用的列表初始化T定义如下:

  • [...]
  • 否则,如果T是引用类型,则引用类型的prvalue临时值T是copy-list-initialized或direct-list-initialized,具体取决于引用的初始化类型,并且引用绑定到该临时值.[ 注意:像往常一样,如果引用类型是非const类型的左值引用,则绑定将失败并且程序格式错误.- 结束说明 ]

§12.2[class.temporary]/p5:

函数调用(5.2.2)中的引用参数的临时绑定将持续到包含该调用的完整表达式完成为止.