RValues

时间:2017-03-30 00:44:02

标签: c++ c++11 c++14

现在我有一个只有一个构造函数的类

ShaderProgram(std::initializer_list<std::reference_wrapper<const Shader>> shaders);

我正在使用引用包装器,因为我没有引用的initializer_list而且我无法复制

此代码有效

    Shader v{ Shader::Type::Vertex, readFile("res/simple.vert") };
    Shader f{ Shader::Type::Fragment, readFile("res/simple.frag") };
    ShaderProgram shader{ v, f };

但这不是

    ShaderProgram shader{ 
        Shader { Shader::Type::Vertex, readFile("res/simple.vert") },
        Shader { Shader::Type::Fragment, readFile("res/simple.frag") }
    };

我应该在这里介绍什么?我想我缺少某种构造函数来处理rvalues但我似乎无法使它工作

当前的错误是:

  

E1776函数“std :: reference_wrapper&lt; _Ty&gt; :: reference_wrapper(_Ty&amp;&amp;)[with   _Ty = const core :: graphics :: Shader]“(在”c:\ Program Files(x86)\ Microsoft Visual“第1830行声明   工作室\ 2017年\社区\ VC \工具\ MSVC \ 14.10.25017 \包括\ type_traits“)   无法引用 - 它已被删除   函数RenderEngine Main.cpp(77)

1 个答案:

答案 0 :(得分:1)

无法从prvalue创建

reference_wrapper。所以你所做的事情是不可能的。

在我看来,你的界面似乎有些困惑。一方面,Shader是不可复制的类型。但另一方面,您似乎想要使用ShaderProgram prvalues调用Shader,这些prvalues将在构造ShaderProgram对象后立即销毁。

我说,有ShaderProgram的两个接口:一个接受initializer_list<Shader>的接口:这样的用户对保持Shader个对象在函数的初始化之后不感兴趣。另一个将对Shader个对象的非空指针的数组/向量/等进行处理。这适用于那些希望在创建程序后保留Shader个对象的用户。

还可以创建一个可变参数模板,您需要所有元素都是Shader类型。如果没有C ++ 17的特性,最后一部分(验证所传递的所有类型都是某种形式的Shader)是非常困难的。