gpt4 book ai didi

c++ - 用函数替换宏会导致 "signed/unsigned mismatch"警告

转载 作者:行者123 更新时间:2023-12-05 09:02:04 25 4
gpt4 key购买 nike

对于这个片段

   const std::vector<int> v;
if (v.size() != 1) {} // could call operator!=()

即使在高警告级别(Visual Studio 2022 中启用的所有警告),代码也能完全符合要求。但是,如果我将参数传递给函数

   const auto f = [](auto&& lhs, auto&& rhs) { if (lhs != rhs) {}};
f(v.size(), 1);

编译器生成一个 '!=': signed/unsigned mismatch 警告。

如何使函数的行为与“内联”代码相同,即没有警告?


请记住,“真实代码”类似于

#define f(lhs, rhs) if (lhs != rhs) {}

我想“做'正确的事'”并用函数替换宏

temmplate<typename TLhs, typename TRhs>
inline void f(TLhs&& lhs, TRhs&& rhs)
{
if (lhs != rhs) {}
}

最佳答案

在直接比较中,编译器知道比较双方的类型,因此可以确保 1 是正确大小的无符号类型。

当您调用 lambda 时,rhs 的类型将被推断为 int,因为这才是 1 的真正含义。由于 lhs 将是无符号类型,因此当您将无符号大小与(有符号)int1 进行比较时,您会在比较中收到警告>.


对于编译器必须推导参数的任何类型的可调用对象,您都会遇到同样的问题,例如函数模板:

template<typename T, typename U>
void f(T const& lhs, U const& rhs);

对于函数模板,解决方案很简单:为两个参数使用相同的单一类型:

template<typename T>
void f(T const& lhs, T const& rhs);

关于c++ - 用函数替换宏会导致 "signed/unsigned mismatch"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72101010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com