gpt4 book ai didi

C++ - 通过 enable_if_t 推导参数包(可变参数模板)构造函数和复制构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:44 25 4
gpt4 key购买 nike

更新:
谢谢你,大露营。
这是最后的 struct A .

struct A
{
template<class ... Args,class=std::enable_if_t<(sizeof...(Args)!=1)>>
A(Args &&...args)
{
cout<<'v';
}
template<class Arg,class=std::enable_if_t<!std::is_base_of<std::remove_reference_t<Arg>,A>::value>>
A(Arg &&arg)
{
cout<<'v';
}
A(const A &)
{
cout<<'c';
}
A(A &&)
{
cout<<'m';
}
};

来源:
关于这段代码,

#include<iostream>
#include<type_traits>
#include<utility>
using namespace std;

struct A
{
template<class ... Args,class=std::enable_if_t<
sizeof...(Args)!=1
||!std::is_same<std::remove_cv_t<std::remove_reference_t<Args>>,A>::value>>
A(Args &&...args)
{
cout<<'v';
}
A(const A &)
{
cout<<'c';
}
A(A &&)
{
cout<<'m';
}
};

int main()
{
A a{10};
A b{10,20};
A c{b};
const A d{c};
A e{move(c)};
}

输出是vvvvm在 VC++ 14.0 中。
但是为什么输出不是vvccm ?
(我希望 c and d 使用复制构造函数。而且我知道 Effective Modern C++ Item 27 只使用一个转发引用。)

最佳答案

因为 bc,当您将它们传递给 的构造函数时,对编译器来说是 A& >cd,因此 Args &&...argsconst A & 更匹配。

要实现你想要的,你可以这样做:

struct A
{
A() = default;

template<class ... Args,std::enable_if_t<(sizeof...(Args)>1), bool> = true>
A(Args &&...args)
{
cout<<'v';
}

template<class Arg,std::enable_if_t<!std::is_base_of<A, std::remove_reference_t<Arg>>::value, bool> = true>
A(Arg && arg)
{
cout<<'v';
}

A(const A &)
{
cout<<'c';
}
A(A &&)
{
cout<<'m';
}
};

关于C++ - 通过 enable_if_t 推导参数包(可变参数模板)构造函数和复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36231824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com