调试可变参数
Debug variadic arguments
我目前正在调试构建中的一个问题,在可变参数中,参数的数量与预期不符。
目前我的代码类似于:
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 中按预期执行,而在使用 Clang 的static_assert上失败。
你们中有谁知道一个技巧来迫使叮当揭示它假设可变参数包是什么?
编辑问题与需要抛出的复制结构有关,非常特定于 Clang-Cl
手头的问题似乎是编译器错误,记录为 https://bugs.llvm.org/show_bug.cgi?id=38801
完整复制品:
测试.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;
}
跑.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.
相关文章:
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 如何使用可变参数模板强制转换每个变体类型
- 关于如何在具有单个参数的变体构造中选择替代方案?
- 调用参数排列不变函数 f(i++, i++)
- 参数归纳与标准::变体
- 模板化回调参数的逆变,如 C# 中的逆变
- 如何在没有参数包的情况下编写变差函数
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 获取模板参数的成员变量值列表
- 保留短 lambda 用作函数的中间参数,使用 clang 格式保持不变
- 如何定义变体<x,y,z>提取模板参数的子类型
- 正确对齐内存模板,参数顺序不变
- 递归中不同参数类型的变元模板函数
- 通过函数指针传递给变差函数的参数会更改其值
- 提升预定义为带有参数的全局 lambda 的变体访问者
- 使用可变参数模板参数提升变体访问者
- boost ::变体 - 为什么模板参数比const字符串参数具有更高的优先级
- 将变参数包中的值加载到临时数组中
- 使用额外参数提升变体访客
- 正在将动态数组元素解析为参数?(变音符)