gpt4 book ai didi

具有私有(private)复制构造函数的 C++11 std::is_convertible 行为

转载 作者:可可西里 更新时间:2023-11-01 18:35:50 26 4
gpt4 key购买 nike

我正在努力理解 std::is_convertible在 C++11 中。根据cppreference.com , std::is_convertible<T,U>::value当且仅当“如果类型为 T 的虚数右值可用于返回 U 的函数的返回语句中”,则应计算为 1。不过,措辞并未说明该函数可能在何处声明。当 U 的复制构造函数时,人们应该期待什么?是私有(private)的?当 T 时应该期待什么是左值引用吗?

例如,考虑这段代码:

#include <iostream>
#include <type_traits>
struct Fact_A;
struct A {
friend struct Fact_A;
A() = default;
A(A&&) = delete;
private:
A(const A&) = default;
};
struct Ref_A {
A* _ptr;
Ref_A(A* ptr) : _ptr(ptr) {}
operator A& () { return *_ptr; }
};
struct Fact_A {
static A* make_A(const A& a) { return new A(a); }
static A f(A* a_ptr) { return Ref_A(a_ptr); }
//static A g(A&& a) { return std::move(a); }
};
int main() {
A a1;
A* a2_ptr = Fact_A::make_A(a1);
(void)a2_ptr;
std::cout << std::is_convertible< Ref_A, A >::value << "\n" // => 0
<< std::is_convertible< Ref_A, A& >::value << "\n" // => 1
<< std::is_convertible< A&, A >::value << "\n"; // => 0
}

我正在使用 gcc-4.8.2clang-3.4 (输出没有区别),我编译:

{g++|clang++} -std=c++11 -Wall -Wextra eg.cpp -o eg

在这里,std::is_convertible< Ref_A, A >报告 0 .但是,您可以看到 Fact_A::f返回 A 类型的对象, 和一个 Ref_A 类型的右值在其返回语句中使用。问题是 A 的拷贝构造函数是private , 因此该功能不能放在其他任何地方。当前行为是否符合标准?

第二个问题。如果我删除 private , 输出变为 1 1 1 .最后一个1是什么意思意思是?什么是“A& 类型的右值”?那是右值引用吗?因为您可能会注意到我明确删除了 A 的移动构造函数.因此,我无法申报 Fact_A::g .但是,std::is_convertible< A&, A >报告 1 .

最佳答案

is_convertible在 n3485 的 [meta.rel]/4 中定义如下:

Given the following function prototype:

template <class T> typename
add_rvalue_reference<T>::type create();

the predicate condition for a template specialization is_convertible<From, To> shall be satisfied if and only if the return expression in the following code would be well-formed, including any implicit conversions to the return type of the function:

To test() {
return create<From>();
}

在这里,您需要一个可移动/可复制的 To : 返回语句应用隐式转换,如果To,这需要一个可访问的复制/移动构造函数是类类型(T& 不是类类型)。

与 [conv]/3 相比

An expression e can be implicitly converted to a type T if and only if the declaration T t=e; is well-formed, for some invented temporary variable t.


如果FromT& , 你会得到类似的东西

To test() {
return create<T&>();
}

类似于std::declval , 是一个左值:表达式 create<T&>()是/产生一个左值,因为 T& && (通过 add_rvalue_reference )折叠为 T& .

关于具有私有(private)复制构造函数的 C++11 std::is_convertible 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23003942/

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