Согласно P1814R0, вывод шаблона должен работать для псевдонима со значением по умолчанию. С GCC 12.2 (-std=c++20) следующий код был успешно создан. Однако в MSVC v19.33(/std:c++20) (который поддерживает P1814R0) я получил ошибку
<source>(10): error C2641: cannot deduce template arguments for 'Matrix3'
Это ошибка MSVC или я пропустил некоторые настройки в MSVC?
Тестовые коды:
template <typename Type, int Row, int Col, int Options = 0>
class Matrix {
Type storage[Row * Col];
};
template <typename Type = double>
using Matrix3 = Matrix<Type, 3, 3>;
int main() {
Matrix3 a;
return 0;
}
Похоже, что Matrix3<>
работает для MSVC.
Вам нужен Matrix3 a{};
для MSVC. (Не уверен, что {}
здесь необходим для текущей формулировки)
Синтаксис для того, чтобы сказать: я не хочу предоставлять аргументы шаблона, просто используйте значения по умолчанию, должен быть:
Matrix3<> a;
Действительно, C++20 принял P1814 в раздел over.match.class.deduct, поэтому кажется, что следующее должно быть допустимо, начиная с C++20:
Matrix3 a;
Как упоминает OP в комментарии GCC отклонил вышеизложенное в C++ 17 и принял его в C++ 20.
Как упоминал @康桓瑋 MSVC принимает, начиная с С++ 20, только форму:
Matrix3 a{};
но все же отвергает:
Matrix3 a;
Clang по-прежнему отвергает оба.
Кажется, что GCC обновлен для C++20 в этом отношении, MSVC сделал часть пути, а Clang отстает.
Добавляя <>, компилятор вынужден использовать аргумент шаблона по умолчанию. Я думаю, что CTAD здесь больше нет. Я изменил стандарт gcc на -std=c++17, и на самом деле gcc выдал мне ошибку error: alias template deduction only available with '-std=c++20' or '-std=gnu++20'
. Поскольку clang не реализует P1814R0, вывод clang кажется мне разумным. Тем не менее, MSVC утверждает, что реализует P1814R0, но я получил непредвиденную ошибку.
Ага, даже прямое указание стандарта msvc не помогает: godbolt.org/z/hMxK1M9x1