相关疑难解决方法(0)

是否定义了将xvalues转换为左值以传递给函数?

最近我发现 ,有时能够将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_castxvalues …

c++ undefined-behavior language-lawyer c++11 c++14

14
推荐指数
1
解决办法
536
查看次数

声明后在C++向量中分配元素

请参阅下面的代码和评论:

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)

c++ resize vector dynamic

5
推荐指数
1
解决办法
5803
查看次数

如何使用std :: copy直接从文件流读取到容器?

我遇到了一个很酷的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)

我如何做类似的事情从文件流直接读入容器?让我们说一个包含内容的简单文件:

"快速的棕色狐狸跳过懒狗."

我希望每个单词都是复制行后面向量中的一个单独元素.

c++ stl

4
推荐指数
2
解决办法
5397
查看次数

为什么istreambuf_iterator没有提前工作

我正在阅读使用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.请有人解释发生了什么!

c++ iterator binaryfiles istream-iterator ifstream

2
推荐指数
1
解决办法
859
查看次数