gpt4 book ai didi

c++ - "Parameter set, but not used"模板函数警告

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:15 24 4
gpt4 key购买 nike

我收到以下 警告:参数 'tupleValue' 已设置但未使用 [-Wunused-but-set-parameter],但在 return 语句中显式使用了该参数。这是否真的意味着返回值在调用序列后面的某个地方被忽略并且编译器足够酷以在这一行优化它?这是代码:

template<unsigned int ...Vs, class ...Ts>
typename removeLastType<Ts...>::type internalRemoveData(intValues<Vs...>, std::tuple<Ts...> tupleValue)
{
return std::forward_as_tuple(std::get<Vs>(tupleValue)...);
}

完整的来源在这里:https://github.com/copperspice/cs_signal/blob/master/src/cs_internal.h#L316

在 Windows 中编译:

-- The C compiler identification is GNU 5.3.0  
-- The CXX compiler identification is GNU 5.3.0

最佳答案

实际上不是答案,但正如@RinatVeliakhmedov 指出的那样,您的代码中有未定义的行为。 internalRemoveData 的返回值函数是一个 std::tuple ,由悬挂引用组成,即对不再存在的对象的引用。

考虑以下简化情况:

struct X {
X() { std::cout << "def ctor\n"; }
~X() { std::cout << "dtor\n"; }
void f() { std::cout << "f\n"; }
};

template<int ...Is, class ...Ts>
auto f(std::tuple<Ts...> t) {
return std::forward_as_tuple(std::get<Is>(t)...);
}

int main() {
auto res = f<0>(std::tuple<X>{});
std::cout << "---" << std::endl;
// std::get<0>(res).f(); // would use no-longer existing object
}

这个程序打印出:

def ctor
dtor
---

f之后功能已完成,X 的对象不存在不再。


请注意,此问题可能非常危险,因为程序可以按预期运行。我在 Wandbox 中尝试过,未注释 std::get<0>(res).f();语句和程序打印出来f并没有表现出任何错误。未定义的行为也包括预期的行为。

关于c++ - "Parameter set, but not used"模板函数警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49381597/

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