| 5 | import <iostream>; |
| 6 | |
| 7 | int main() |
| 8 | { |
| 9 | // Class Template Argument Deduction (CTAD) in action: |
| 10 | Array integers{ 1, 2, 3, 4, 5 }; // Deduced type: Array<int> |
| 11 | Array doubles{ 1.0, 2.0, 3.0, 4.0, 5.0 }; // Deduced type: Array<double |
| 12 | |
| 13 | // But... caution! |
| 14 | { |
| 15 | const size_t numValues{ 50 }; |
| 16 | Array<double> values{ numValues }; // Now uses the initializer list constructor! |
| 17 | |
| 18 | std::cout << "Wrong constructor used, so " << values.getSize() << " != " << numValues << std::endl; |
| 19 | std::cout << "Single value contained in Array<> is " << values[0] << std::endl; |
| 20 | } |
| 21 | |
| 22 | // Workaround: do not use uniform initialization (or "near uniform", as is thus more appropriate...) |
| 23 | { |
| 24 | const size_t numValues{ 50 }; |
| 25 | Array<double> values(numValues); // Uses Array(size_t) constructor as before |
| 26 | |
| 27 | std::cout << "Intended constructor used, so " << values.getSize() << " == " << numValues << std::endl; |
| 28 | std::cout << "All values are equal to " << values[numValues / 2] << std::endl; |
| 29 | } |
| 30 | } |