Отладка переменных аргументов - PullRequest
0 голосов
/ 01 сентября 2018

В настоящее время я отлаживаю проблему в нашей сборке, в которой количество аргументов не соответствует ожидаемому.

В настоящее время мой код выглядит следующим образом:

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{}};

Исходя из этого кода, можно ожидать, что в Ctor передаются 2 аргумента.

Удивительно, но этот код работает, как и ожидалось, с MSVC и завершается с ошибкой в ​​static_assert с Clang.

Кто-нибудь из вас знает хитрость, заставляющую кланга показать, что он предполагает набором переменных аргументов?

Редактировать Проблема связана со структурой копирования, которая требуется для броска, очень специфично для Clang-Cl

1 Ответ

0 голосов
/ 01 сентября 2018

Похоже, что проблема связана с ошибкой компилятора, зарегистрированной как https://bugs.llvm.org/show_bug.cgi?id=38801

Полное воспроизведение:

test.cpp

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;
}

run.bat

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.
...