template<typename T> struct S {};
template<typename T> struct R {};
int main() {
typedef S<double> s1;
typedef S<int> s2;
typedef R<int> s3;
static_assert(xxx<s1, s2>::value,
"No, assertion must not be raised");
static_assert(xxx<s2, s3>::value,
"Yes, assertion must be raised");
}
Run Code Online (Sandbox Code Playgroud)
所以,我希望在编译时返回false xxx<s1, s2>::value而xxx<s2, s3>::value返回true.
在C++中是不是存在xxx?或者,在C++中理论上是否存在xxx,但可能还没有人做过呢?
阅读本文和本标准以及标准的23.3.6.5/1,其中最新的C++标准草案规定,当重新分配其元素时,实现者应优先使用非投掷移动构造函数T(T &&t) noexcept而不是const复制构造函数T(const T &t).手术std::vector<T>的结果push_back?关于引用绑定的重载决议是13.3.3.1.4/1吗?
编辑1
我在13.3.3.1.4/1上争论,原因如下:
重载决策选择要在语言中的七个不同上下文中调用的函数.[...] 调用构造函数以进行类对象的直接初始化(8.5)(13.3.1.3) ; [...]这些上下文中的每一个都以其自己独特的方式定义候选函数集和参数列表.但是,一旦确定了候选函数和参数列表,最佳函数的选择在所有情况下都是相同的:首先,候选函数的子集(具有适当数量的参数并满足某些其他条件的函数)是选择形成一组可行的功能(13.3.2).然后,基于将每个参数与每个可行函数的相应参数匹配所需的隐式转换序列(13.3.3.1)来选择最佳可行函数.
从为给定上下文(13.3.1)构造的候选函数集合中,选择一组可行函数,通过比较最佳拟合的参数转换序列(13.3.3),从中选择最佳函数.可行函数的选择考虑了除转换序列的排名之外的参数和函数参数之间的关系.
当类类型的对象被直接初始化(8.5),或从相同或派生类类型(8.5)的表达式进行复制初始化时,重载决策选择构造函数.
对于参数类型为参考的情况,请参见13.3.3.1.4.
当引用类型的参数直接(8.5.3)绑定到参数表达式时,隐式转换序列是标识转换,[...]
因此,我的结论是身份的转换结果在需要的优先顺序的要求T(T &&t) noexcept了T(const T &t).但是,我所争辩的另一方并不相信.所以,我在这里问.
编辑2
以下是23.3.6.5和13.3.3.1.4之间的联系:
首先,23.3.6.5要求以下内容std::vector:
[...]
void push_back(const T& …