ポインターとかはどうなるの? って疑問に思う人もいるでしょうから、一応実装例だけ示しておきます。
結論からいうと何も変わらないんですがね…
では実装例です。
1 #include <type_traits>
2
3 template<class T = void>
4 struct Foo {
5 Foo(){}
6 Foo(const Foo&){}
7 };
8
9 template<class T>
10 struct Bar {
11 Bar(T,T){}
12 };
13
14 #if __cplusplus >= 201703L
15 template<class T>
16 Foo(T) -> Foo<T>;
17
18 template<class T = void>
19 Foo(void) -> Foo<T>;
20
21 template<class T>
22 Bar(T,T) -> Bar<T>;
23 #endif
24
25 int main(){
26 #if __cplusplus >= 201703L
27 auto *a = new Foo{};
28 auto *b = new Bar{1,2};
29 #else
30 auto *a = new Foo<void>{};
31 auto *b = new Bar<int>{1,2};
32 #endif
33 static_assert(std::is_same<decltype(a),Foo<void>*>::value,"");
34 static_assert(std::is_same<decltype(b),Bar<int>*>::value,"");
35 delete a;
36 delete b;
37 }このように new 演算子でコンストラクターを呼び出しても同じ効果を保持してくれます。
Copyright 2017-2018, by Masaki Komatsu