static_assert意外行为
static_assert unexpected behavior
我的类有一个重载operator&
,如果参数是指针,我会执行静态断言。
class test {
public:
template<typename T>
friend inline test& operator&(test& so, T const& t) {
std::cout << "is_pointer : " << std::is_pointer<T>::value << std::endl;
static_assert(std::is_pointer<T>::value, "no operator overloaded for pointers.");
// some stuff
}
};
如果我使用此运算符,即使该类型绝对不是指针,我也总是得到断言。 std::cout << "is_pointer : " << std::is_pointer<T>::value << std::endl;
正在打印零...
int main() {
test t;
t & 123;
return 0;
}
例。
当然,断言失败了。您要求类型 T
是指针,但此处T
是一个int
。
也许你的意思是以下几点?
// Ensure that `T` is not a pointer
static_assert(!std::is_pointer<T>::value, "no operator overloaded for pointers");
断言是确保特定条件的语句。它不完全是"如果 X 则输出错误消息 Y";事实上,情况恰恰相反。:)
您断言传递的类型是一个指针。如果您传递的内容不是指针,则static_assert()
失败并收到一条消息。似乎,您想精确地否定条件,因为您不想使用指针:
static_assert(!std::is_pointer<T>::value, "no operator overloaded for pointers.");
听起来您希望当且仅当T
不是指针时才编译它。 在您的原始表达式中,您断言T
是一个指针。
基本上,static_assert
的意思是,"我的第一个参数最好是真的,否则我会在编译时抱怨第二个参数作为错误消息。
你似乎想要什么:
class test {
public:
template<typename T>
friend inline test& operator&(test& so, T const& t) {
static_assert(! std::is_pointer<T>::value, "no operator overloaded for pointers.");
// some stuff
}
};
相关文章:
- 在C++中对T*类型执行std::move的意外行为
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 使用vscode调试时,GDB意外退出
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- C++中意外的多头值
- vector.size() 在比较中意外工作
- 使用 malloc() 时出现意外大小
- 多线程程序中出现意外的内存泄漏
- 为什么static_cast基础类型的枚举类int8_t获得意外值?
- 字符串比较中的意外输出
- 我的代码中的意外价值以及我如何修复它
- 如何在 Google 测试中抑制终止时 assert() 意外触发