Skip to content

Latest commit

ย 

History

History
241 lines (162 loc) ยท 8.62 KB

ITEM07.md

File metadata and controls

241 lines (162 loc) ยท 8.62 KB
  • ํ•ญ๋ชฉ 7 : ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ๊ด„ํ˜ธ์™€ ์ค‘๊ด„ํ˜ธ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ผ.

    1. ๊ธฐ๋ณธ ๊ฐ์ฒด ์ƒ์„ฑ

๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ๋‹ค.

int x(0) ; // ์ดˆ๊ธฐ์น˜๋ฅผ ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ผ ์˜ˆ
int y = 0; // ์ดˆ๊ธฐ์น˜๋ฅผ "=" ๋‹ค์Œ์— ์ง€์ •ํ•œ ์˜ˆ
int z { 0 }; // ์ดˆ๊ธฐ์น˜๋ฅผ ์ค‘๊ด„ํ˜ธ๋กœ ๊ฐ์‹ผ ์˜ˆ
int z = { 0 } // "="์™€ ์ค‘๊ด„ํ˜ธ๋กœ ์ดˆ๊ธฐ์น˜๋ฅผ ์ง€์ •ํ•œ ์˜ˆ, ๋Œ€์ฒด๋กœ ์ค‘๊ด„ํ˜ธ๋งŒ ์‚ฌ์šฉํ•œ ๊ตฌ๋ฌธ๊ณผ ๋™์ผ

Widget w1; // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
Widget w2 = w1; // ๋ฐฐ์ •์ด ์•„๋‹˜; ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
w1 = w2; ๋ฐฐ์ •; ๋ณต์‚ฌ ๋ฐฐ์ • ์—ฐ์‚ฐ์ž๋ฅผ ํ˜ธ์ถœ
    1. ๊ท ์ผ ์ดˆ๊ธฐํ™”์˜ ์žฅ์  (์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”)

C++98๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ง€์›ํ–ˆ์ง€๋งŒ, ์›ํ•˜๋Š” ์ดˆ๊ธฐํ™”๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ•œํ• ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค.

(ex. ์„œ๋กœ ๋‹ค๋ฅธ ์ž„์˜์˜ ๊ฐ’๋“ค์„ ๋‹ด๋Š” STL ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ)

C++11์€ ๊ท ์ผ ์ดˆ๊ธฐํ™”๋ฅผ ๋„์ž…! ์ด๊ฒƒ์€ ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ ํ•œ ์ข…๋ฅ˜์˜ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ.

std::vector<int> v{ 1, 3, 5 }; // v์˜ ์ดˆ๊ธฐ ๋‚ด์šฉ์€ 1, 3, 5

class Widget
{
private:
    int x{0}; // OK
    int y = 0; // OK
    int z(0); // NOT OK
    // not-static value์— ๋Œ€ํ•œ default๊ฐ’์„ ์ดˆ๊ธฐํ™” ํ•˜๋Š”๋ฐ ()๋Š” ์•ˆ๋œ๋‹ค.
}

๋ณต์‚ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด(์ด๋ฅผํ…Œ๋ฉด std::atomic )๋Š” ์ค‘๊ด„ํ˜ธ๋‚˜ ๊ด„ํ˜ธ๋กœ๋Š” ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ "="๋กœ๋Š” ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์—†๋‹ค.

std::automic<int> ai1{ 0 } // OK
std::automic<int> ai2(0) // OK
std::automic<int> ai3 = 0 // NOT OK

// Copy๊ฐ€ ์•ˆ๋˜๋Š” Object์— ๋Œ€ํ•ด์„œ๋Š” ()๋Š” ๋˜๋Š”๋ฐ =๋Š” ์•ˆ๋œ๋‹ค.

์œ„ ๋‚ด์šฉ์„ ๋ณด๋ฉด ์–ด๋””์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ {} ๋ฟ์ด๋‹ค. (์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”๋ฅผ '๊ท ์ผ' ์ดˆ๊ธฐํ™”๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ !)

์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”์˜ ํ˜์‹ ์ ์ธ ๊ธฐ๋Šฅ ํ•˜๋‚˜๋Š” ์•”๋ฌต์  ์ขํžˆ๊ธฐ ๋ณ€ํ™˜์„ ๋ฐฉ์ง€ํ•ด ์ค€๋‹ค!

double x, y, z;
int sum1{ x + y + z }; //์˜ค๋ฅ˜ double๋“ค์˜ ํ•ฉ์„ int๋กœ ํ‘œํ˜„ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Œ

๊ด„ํ˜ธ๋‚˜ "="๋ฅผ ์ด์šฉํ•œ ์ดˆ๊ธฐํ™”๋Š” ์ด๋Ÿฌํ•œ ์ขํžˆ๊ธฐ ๋ณ€ํ™˜์„ ์ ๊ฒ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

int sum2(x + y + z); // OK
int sum3 = x + y + z; // OK

์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”์˜ ๋˜ ๋‹ค๋ฅธ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ํŠน์ง•! C++์—์„œ ๊ฐ€์žฅ ์„ฑ๊ฐ€์‹  ๊ตฌ๋ฌธ ํ•ด์„(most vexing parse)์— ์ž์œ ๋กญ๋‹ค!

C++์—์„œ ๊ฐ€์žฅ ์„ฑ๊ฐ€์‹  ๊ตฌ๋ฌธ ํ•ด์„์€ "์„ ์–ธ์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํ•ญ์ƒ ์„ ์–ธ์œผ๋กœ ํ•ด์„ํ•ด์•ผ ํ•œ๋‹ค."๋Š” C++์˜ ๊ทœ์น™์—์„œ ๋น„๋กฏ๋œ ํ•˜๋‚˜์˜ ๋ถ€์ž‘์šฉ

Widget w1(10) // ์ธ์ˆ˜ 10์œผ๋กœ Widget์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ

Widget w2(); // ๊ฐ€์žฅ ์„ฑ๊ฐ€์‹  ๊ตฌ๋ฌธ ํ•ด์„! Wideget์„ ๋Œ๋ ค์ฃผ๋Š”, w2๋ผ๋Š” ์ด๋ฅด์˜ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธ

์ค‘๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ ์ƒ์„ฑํ•  ๋•Œ์—๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช์ง€ ์•Š๋Š”๋‹ค.

Widget w3{}; // ์ธ์ˆ˜ ์—†์ด Widget์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ

์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”์—๋Š” ์นญ์ฐฌํ• ์ ์ด ๋งŽ๋‹ค.

๊ฐ€์žฅ ๋‹ค์–‘ํ•œ ๋ฌธ๋งฅ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ! ์•”๋ฌต์ ์ธ ์ขํžˆ๊ธฐ ๋ณ€ํ™˜์„ ๋ฐฉ์ง€! C++์˜ ๊ฐ€์žฅ ์„ฑ๊ฐ€์‹  ๊ตฌ๋ฌธ ํ•ด์„์œผ๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ๋‹ค.

    1. ์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”์˜ ๋‹จ์  ๋ฐ std::initializer_list

ํ•˜์ง€๋งŒ ์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”์˜ ๋‹จ์ ์€ ์ข…์ข… ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ–‰๋™์„ ๋ณด์ธ๋‹ค.

์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™”, std::initializer_list, ์ƒ์„ฑ์ž ์ค‘๋ณต์ ์žฌ ํ•ด์†Œ ์‚ฌ์ด์˜ ๋’ค์–ฝํžŒ ๊ด€๊ณ„์—์„œ ๋น„๋กฏ๋œ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ(auto๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ) ์„ ์–ธ๋œ ๋ณ€์ˆ˜์—์„œ๋Š” ์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐ์น˜๊ฐ€ ์ข€ ๋” ์ง๊ด€์ ์ธ ํ˜•์‹์œผ๋กœ ์—ฐ์—ญ ๋˜์—ˆ์ง€๋งŒ

auto๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด์„œ๋Š” std::initializer_list ํ˜•์‹์œผ๋กœ ์—ฐ์—ญ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

class Widget {
public:
  Widget(int i, bool b);
  Widget(int i, double d);
};

Widget w1(10, true); // ์ฒซ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
Widget w2{10, true); // ์ฒซ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
Widget w3(10, 5.0); // ๋‘˜์งธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
Widget w4{10, 5.0} // ๋‘˜์งธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ

But! ์ƒ์„ฑ์ž ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์ด std::initializer_list ํ˜•์‹์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ์‹œ

์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์€ ์ด์ƒํ•˜๊ฒŒ๋„ std::initializer_list๋ฅผ ๋ฐ›๋Š” ์ค‘๋ณต ์ ์žฌ ๋ฒ„์ „์„ ๊ฐ•ํ•˜๊ฒŒ ์„ ํ˜ธํ•œ๋‹ค.

class Widget {
public:
  Widget(int i, bool b);
  Widget(int i, double d);
  Widget(std::initializer_list<long diouble> il); // ์ถ”๊ฐ€
};

// ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ; std::initializer_list ์ƒ์„ฑ์ž ํ˜ธ์ถœ (10, true๊ฐ€ long double๋กœ ๋ณ€ํ™˜)

Widget w2{10, true}; 
Widget w4{10, 5.0};

๋ณดํ†ต์€ ๋ณต์‚ฌ ์ƒ์„ฑ์ด๋‚˜ ์ด๋™ ์ƒ์„ฑ์ด ์ผ์–ด๋‚ฌ์„ ์ƒํ™ฉ์—์„œ๋„ std::initializer_list ์ƒ์„ฑ์ž๊ฐ€ ๋ผ์–ด๋“ค์–ด์„œ ๊ธฐํšŒ๋ฅผ ๊ฐ€๋กœ์ฑˆ๋‹ค.

class Widget {
public:
  Widget(int i, bool b);
  Widget(int i, double d);
  Widget(std::initializer_list<bool> il); // ์š”์†Œ์˜ ํ˜•์‹์ด bool
  // ์•”๋ฌต์  ๋ณ€ํ™˜ ํ•จ์ˆ˜๋Š” ์—†์Œ
};

Widger w{10, 5.0} // ์˜ค๋ฅ˜ ์ขํžˆ๊ธฐ ๋ณ€ํ™˜์ด ํ•„์š”ํ•จ

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž์‹ ์˜ ๊ฒฐ์‹ฌ์„ ํฌ๊ธฐํ•˜๊ณ  ๋ณดํ†ต์˜ ์ค‘๋ณต์ ์žฌ ํ•ด์†Œ๋กœ ๋ฌผ๋Ÿฌ๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐ์น˜์˜ ์ธ์ˆ˜ ํ˜•์‹๋“ค์„

std::initializer_list ์•ˆ์˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„์˜ˆ ์—†์„ ๋•Œ!

std::initializer_list<std::string>
class Widget {
public:
  Widget(int i, bool b);
  Widget(int i, double d);
  Widget(std::initializer_list<std::string> il); // ์ถ”๊ฐ€
};

Widget w2{10, true}; // ์ค‘๊ด„ํ˜ธ ์‚ฌ์šฉ, ์ฒซ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
Widger w4{10, 5.0}; // ์ค‘๊ด„ํ˜ธ ์‚ฌ์šฉ, ๋‘˜๋•Œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
// ๋นˆ ์ค‘๊ด„ํ˜ธ ์Œ
class Widget {
public:
Widget(); // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž
  Widget(std::initializer_list<int> il); // std::initializer_list ์ƒ์„ฑ์ž
  // ์•”๋ฌต์  ๋ณ€ํ™˜ ํ•จ์ˆ˜ ์—†์Œ
};

Widget w1; // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
Widget w2{}; // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
Widget w3(); // ๊ฐ€์žฅ ์„ฑ๊ฐ€์‹  ๊ตฌ๋ฌธ ํ•ด์„! ํ•จ์ˆ˜ ์„ ์–ธ!

// ๋งŒ์•ฝ std::initializer_list ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด -> {{}} , ({})
Widget w4({});
Widget w5{{}};

// std::vector

std::vector์—๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ดˆ๊ธฐ ํฌ๊ธฐ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ชจ๋“  ์ดˆ๊ธฐ ์š”์†Œ์˜ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”

๋น„ std::initializer_list , std::initializer_list ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค.

std::vector v1(10, 20); // ๋ชจ๋“  ์š”์†Œ์˜ ๊ฐ’์ด 20์ธ, ์š”์†Œ 10๊ฐœ์งœ๋ฆฌ std::vector๊ฐ€ ์ƒ์„ฑ๋จ

std::vector v2{10, 20}; // ๊ฐ’์ด ๊ฐ๊ฐ 10, 20์ธ ๋‘ ์š”์†Œ๋ฅผ ๋‹ด์€ std::vectore๊ฐ€ ์ƒ์„ฑ๋จ

    1. ์ •๋ฆฌ

์ฒซ์งธ.

ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์—๋Š”, ๋งŒ์ผ ์ผ๋‹จ์˜ ์ค‘๋ณต์ ์žฌ๋œ ์ƒ์„ฑ์ž ์ค‘์— std::initializer_list๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ

์กด์žฌํ•œ๋‹ค๋ฉด, ์ค‘๊ด„ํ˜ธ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ์„ ์ด์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์—๋Š” std::initializer_list ์ค‘๋ณต์ ์žฌ๋“ค๋งŒ ์ ์šฉ ๋  ์ˆ˜ ์žˆ์Œ์„ ์ฃผ์˜

๋‘˜์งธ.

ํด๋ž˜์Šค ์‚ฌ์šฉ์ž๋กœ์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ด„ํ˜ธ์™€ ์ค‘๊ด„ํ˜ธ๋ฅผ ์„ธ์‹ฌํ•˜๊ฒŒ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ผ์•„์„œ ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ผญ ํ•„์š”ํ• ๋•Œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

์ค‘๊ด„ํ˜ธ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  1. ๋‹ค์–‘ํ•œ ๋ฌธ๋งฅ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ์ขํžˆ๊ธฐ ๋ณ€ํ™˜์„ ๋ฐฉ์ง€ํ•ด ์ค€๋‹ค.

  3. ๊ฐ€์žฅ ์„ฑ๊ฐ€์‹  ๊ตฌ๋ฌธ ํ•ด์„์—์„œ ์ž์œ ๋กญ๋‹ค.

  • ์ด๋•Œ ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ์„ ์ดํ•ด (ex. std::vector)

๊ด„ํ˜ธ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

  1. C++ ๊ตฌ๋ฌธ์  ์ „ํ†ต๊ณผ์˜ ์ผ๊ด€์„ฑ

  2. auto๊ฐ€ std::initializer_list๋ฅผ ์—ฐ์—ญํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋Š” ์ 

  3. ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ์˜๋„์น˜ ์•Š๊ฒŒ std::initializer_list๊ฐ€ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ผ์ด ์—†๋‹ค๋Š” ์ 

  • ์ค‘๊ด„ํ˜ธ๋กœ๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ์„ ์‹œ์ธ (๊ตฌ์ฒด์ ์ธ ๊ฐ’๋“ค๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ)

์กฐ์–ธ์€ ๋‘˜์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•˜๋ผ๋Š” ๊ฒƒ!

ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ์ž์—๊ฒŒ๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์‹œ ๊ด„ํ˜ธ์™€ ์ค‘๊ด„ํ˜ธ์˜ ๊ธด์žฅ ๊ด€๊ณ„๊ฐ€ ํŠนํžˆ๋‚˜ ์งœ์ฆ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋Š”๋ฐ ๋‘˜ ์ค‘ ์–ด๋А๊ฒƒ์„

์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

ex. ์ž„์˜์˜ ๊ฐœ์ˆ˜์˜ ์ธ์ˆ˜๋“ค์„ ์ง€์ •ํ•ด์„œ ์ž„์˜์˜ ํ˜•์‹์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ

template<typename T, typename... Ts>
void doSimeWork(Ts&&... params) {
  params... ์œผ๋กœ๋ถ€ํ„ฐ ์ง€์—ญ T ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
}

T localObject(std::forward<Ts>(params)...); // ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉ
T localObject{std::forward<Ts>(params)...}; // ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉ
std::vector<int> v;
doSomeWork<std::vector<int>>(10, 20);

๋งŒ์•ฝ localObject๊ฐ€ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์š”์†Œ๊ฐ€ 10๊ฐœ์ธ std::vector

์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์š”์†Œ๊ฐ€ 2๊ฐœ์ธ std::vector์ด๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ์ •์ฑ…์„ ์ •ํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๋ถ€์— ๋ฌธ์„œํ™” ํ•จ์œผ๋กœ์จ ๋ฌธ์ œ ํ•ด๊ฒฐ(std::make_unique, std::make_shared)