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。
标准([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)
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |