В настоящее время я отлаживаю проблему в нашей сборке, в которой количество аргументов не соответствует ожидаемому.
В настоящее время мой код выглядит примерно так:
class CustomException : public BaseException
{
public:
template<typename ...T>
CustomException(T &&...args) : BaseException(std::forward<T>(args)...)
{
static_assert(sizeof...(T) == 2);
}
};
throw CustomException{size_t{}, size_t{}};
Основываясь на этом коде, можно ожидать, что 2 аргумента передаются в Ctor.
Удивительно, но этот код работает, как и ожидалось, с MSVC и завершается с ошибкой в static_assert с Clang.
Кто-нибудь из вас знает хитрость, заставляющую кланга раскрыть то, что он предполагает набором аргументов?
редактировать Проблема связана с копированием конструкции, которая требуется для броска, очень специфично для Clang-Cl
Похоже, что проблема связана с ошибкой компилятора, зарегистрированной как https://bugs.llvm.org/show_bug.cgi?id=38801
Полная репродукция:
struct A
{
template<typename ... T>
A(T &&...t)
{
static_assert(sizeof...(T) == 2);
}
A(const A &) = default;
//A(A &) = default;
A(A &&) = default;
A &operator=(const A &) = default;
A &operator=(A &&) = default;
};int main(int, char **)
{
throw A{size_t{}, size_t{}};
return 0;
}
clang-cl.exe -fms-compatibility-version=19.11 /DBOOST_USE_WINDOWS_H -w -Wno-unused-command-line-argument /Zc:inline /nologo /c /GR /EHsc /fp:precise /FS /std:c++17 /diagnostics:caret /O2 /I. /MDd /Zc:forScope /bigobj /Zc:wchar_t test.cpp
test.cpp(7,7): error: static_assert failed
static_assert(sizeof...(T) == 2);
^ ~~~~~~~~~~~~~~~~~
test.cpp(20,10): note: in instantiation of function template specialization 'A::A<A &>' requested here
throw A{size_t{}, size_t{}};
^
1 error generated.
Других решений пока нет …