我有一个对象’S’存储一个简单的指针元组,通过使用可变参数模板使其变得灵活.有两种方法,store()和store2().第一个(商店)工作正常.第二个将无法编译,因为std :: make_tuple失败并显示错误:
‘调用’make_tuple’没有匹配函数
它进一步补充说,从“B *”到“B *&&”之间没有已知的对话.对于第一个参数(此错误在元组库头中很深).
代码在这里:
#include <tuple>
#include <utility>
template<typename...Rs>
struct S
{
void store(std::tuple<Rs*...> rs)
{
rs_ = rs;
}
void store2(Rs*...rs)
{
rs_ = std::make_tuple<Rs*...>(rs...); // This is the guy that breaks
}
private:
std::tuple<Rs*...> rs_;
};
struct B
{};
struct A : S<B, B>
{};
int main()
{
auto *b1 = new B;
auto *b2 = new B;
auto *a1 = new A;
a1->store(std::make_tuple(b1, b2)); // This works
a1->store2(b1, b2); // How can I get this to work?
// (It causes an error in std::make_tuple of store2 above)
}
解决方法:
这是一个错误,因为make_tuple与C 11或更高版本的make_pair一样,采用转发引用,当您明确指定非引用的模板参数时,这些转发引用将成为右值引用.
所以make_tuple< Rs * ...>是元组< Rs * ...> make_tuple(Rs *&& …) – 参数类型都是rvalue引用,它们不绑定到lvalues(而rs …扩展为lvalues列表).
这些make_meow函数的重点是避免写出显式模板参数,所以……不要写它们.
标签:c,c11,variadic-templates 来源: https://codeday.me/bug/20190722/1502949.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。