C++ 是否总是实例化未使用的函数参数?
给定具有未使用且未命名参数的函数:C++ 是否总是实例化未使用的函数参数?,c++,C++,给定具有未使用且未命名参数的函数: template <typename T> void f(T&&) { /* do something, without using T */ } int main() { std::mutex m; f(std::lock_guard<std::mutex> { m }); } 是保证实例化参数,还是允许编译器对其进行优化?来自[class.temp]: 当实现引入具有非平凡构造函数12.1、12
template <typename T> void f(T&&) { /* do something, without using T */ }
int main()
{
std::mutex m;
f(std::lock_guard<std::mutex> { m });
}
是保证实例化参数,还是允许编译器对其进行优化?来自[class.temp]:
当实现引入具有非平凡构造函数12.1、12.8的类的临时对象时,应确保为临时对象调用构造函数
该标准还提供了一个out-in[intro.execution]:
相反,符合
实现只需要模拟抽象机器的可观察行为,如前所述
低于0.5
5本条款有时被称为“仿佛”规则,因为实施可自由忽略本条款的任何要求
国际标准,只要结果是符合要求,就可以从
程序的可观察行为。例如,如果可以,实际实现不需要计算表达式的一部分
推断其值未被使用,且未产生影响程序可观察行为的副作用
当然,获取一个锁可以作为一个影响可观察行为的副作用,因此,是的,该参数保证被实例化,因为它有一个具有可观察副作用的非平凡构造函数 区别是什么?构造函数可能有副作用。@user5434231:在示例代码中添加副作用。如果没有副作用,那么答案就变得微不足道了,因为“仿佛”规则允许所有优化。我添加了一个std::lock_guard示例,它锁定互斥锁并在销毁时解锁。除了“仿佛”规则。