最近我发现 ,有时能够将rvalues 暂时变成左值对我来说很有用.
我一直在使用以下工具:
#include <type_traits>
template <typename T>
inline constexpr std::remove_reference_t<T> &lvalue(T &&r) noexcept {
return static_cast<std::remove_reference_t<T> &>(r);
}
Run Code Online (Sandbox Code Playgroud)
当您必须使用需要左值作为参数的函数时,它很有用,但您对这些特定值的变化没有任何兴趣.当您对与给定的特定参数无关的其他输出向量感兴趣时.
例如,这个:
std::string get_my_file() {
std::ifstream ifs("myfile.txt");
return {std::istreambuf_iterator<char>(ifs), {}};
}
Run Code Online (Sandbox Code Playgroud)
可以改为:
std::string get_my_file() {
return {std::istreambuf_iterator<char>(lvalue(std::ifstream("myfile.txt"))),
{}};
}
Run Code Online (Sandbox Code Playgroud)
还有这个:
std::string temp1 = get_my_shader();
const char *temp2 = temp1.c_str();
glShaderSource(a, 1, &temp2, nullptr);
Run Code Online (Sandbox Code Playgroud)
可以改为:
glShaderSource(a, 1, &lvalue(get_my_shader().c_str()), nullptr);
Run Code Online (Sandbox Code Playgroud)
并允许这样的事情:
void foo(int *x) {
std::cout << *x << std::endl;
}
foo(&lvalue(5));
Run Code Online (Sandbox Code Playgroud)
我想确定我是否在调用任何未定义的行为,因为我没有看到任何行为,尽管可能会有一些转换规则将其视为非法(我忽略).关于临时的生命,我没有看到问题,因为AFAIK,rvalues直到完全表达结束并且函数的使用仅限于此.
有一个最近约标准的变化reinterpret_cast和xvalues …
请参阅下面的代码和评论:
vector<int> v1(10);
cin>>v1[0]; // allowed
cin>>v1[1]; // allowed
// now I want v1 to hold 20 elements so the following is possible:
cin>>v1[15]>>v[19]; // how to resize the v1 so index 10 to 19 is available.
Run Code Online (Sandbox Code Playgroud) 我遇到了一个很酷的STL示例,它使用istream_iterators从std输入(cin)复制到向量.
vector<string> col1;
copy(istream_iterator<string>(cin), istream_iterator<string>(),
back_inserter(col));
Run Code Online (Sandbox Code Playgroud)
我如何做类似的事情从文件流直接读入容器?让我们说一个包含内容的简单文件:
"快速的棕色狐狸跳过懒狗."
我希望每个单词都是复制行后面向量中的一个单独元素.
我正在阅读使用istream_iterators构造一个向量,这个向量是将一个完整的文件内容读入一个字符向量中.虽然我想将文件的一部分加载到字符向量中.
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
ifstream ifs(argv[1], ios::binary);
istreambuf_iterator<char> beginItr(ifs);
istreambuf_iterator<char> endItr(beginItr);
advance(endItr, 4);
vector<char> data(beginItr, endItr);
for_each(data.cbegin(), data.cend(), [](char ch)
{
cout << ch << endl;
});
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为提前不起作用,而上述问题的接受答案有效.为什么不提前工作istreambuf_iterator?
也
endItr++;
endItr++;
endItr++;
endItr++;
cout << distance(beginItr, endItr) << endl;
Run Code Online (Sandbox Code Playgroud)
返回0.请有人解释发生了什么!