수색…
비고
완전한 전달은 인수의 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