수색…


비고

완전한 전달은 인수의 ref-qualifier를 보존하기 위해 참조 를 전달해야합니다. 이러한 참조는 추론 된 상황 에서만 나타납니다. 그건:

template<class T>
void f(T&& x) // x is a forwarding reference, because T is deduced from a call to f()
{
    g(std::forward<T>(x)); // g() will receive an lvalue or an rvalue, depending on x
}

T 가 생성자 호출에서 추론되지 않기 때문에 다음은 완벽한 전달을 포함하지 않습니다.

template<class T>
struct a
{
    a(T&& x); // x is a rvalue reference, not a forwarding reference
};
C ++ 17

C ++ 17에서는 클래스 템플릿 인수를 공제 할 수 있습니다. 위의 예에서 "a"의 생성자는 전달 참조의 사용자가됩니다.

a example1(1);
  // same as a<int> example1(1);

int x = 1;
a example2(x);
  // same as a<int&> example2(x);

공장 기능

임의의 인수 목록을 허용하고 수정되지 않은 인수를 다른 함수로 전달하는 팩토리 함수를 작성한다고 가정하십시오. 그러한 함수의 예로는 make_unique 가 있습니다.이 함수는 안전하게 T 의 새로운 인스턴스를 만들고 인스턴스를 소유 한 unique_ptr<T> 를 반환하는 데 사용됩니다.

variadic 템플릿 및 rvalue 참조에 관한 언어 규칙을 사용하면 이러한 함수를 작성할 수 있습니다.

template<class T, class... A>
unique_ptr<T> make_unique(A&&... args)
{
    return unique_ptr<T>(new T(std::forward<A>(args)...));
}

타원의 사용 ... 유형의 임의의 수를 나타내는 매개 변수 팩을 나타낸다. 컴파일러는이 매개 변수 팩을 호출 사이트에서 올바른 인수 수로 확장합니다. 이 인수는 std::forward 사용하여 T 의 생성자에 std::forward 됩니다. 이 함수는 인수의 ref 한정자를 보존하는 데 필요합니다.

struct foo
{
    foo() {}
    foo(const foo&) {}                    // copy constructor
    foo(foo&&) {}                         // copy constructor
    foo(int, int, int) {}
};

foo f;
auto p1 = make_unique<foo>(f);            // calls foo::foo(const foo&)
auto p2 = make_unique<foo>(std::move(f)); // calls foo::foo(foo&&)
auto p3 = make_unique<foo>(1, 2, 3); 


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow