put_money是否按值或引用保留其参数?

Eri*_*ric 7 c++ undefined-behavior iomanip

以下是否调用未定义的行为?

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <experimental/iterator>

int main() {
    long double values[] = {1, 2, 3};
    std::transform(
        std::begin(values), std::end(values),
        std::experimental::make_ostream_joiner(std::cout, ", "),
        [](long double v) {
            return std::put_money(v + 1);
        }
    );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我担心的是会return std::put_money(v + 1)返回对临时目录的引用v + 1

Art*_*yer 6

标准([ext.manip] / 6)仅定义以下特定表达式:

out << put_­money(mon, intl);
Run Code Online (Sandbox Code Playgroud)

目前尚不清楚如何mon存储它,同时它肯定有可能成为悬挂的参考并成为UB。

一个“简单”的解决方法是使您自己的类知道您存储了值:

struct money_putter {
    long double value;

    template<class charT, class traits>
    friend std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>& os, const money_putter& mon) {
        return os << std::put_money(mon.value);
    }
};


int main() {
    int values[] = {1, 2, 3};
    std::transform(
        std::begin(values), std::end(values),
        std::experimental::make_ostream_joiner(std::cout, ", "),
        [](int i)  {
            return money_putter{i};  // or i + 1
        }
    );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)