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示例,它锁定互斥锁并在销毁时解锁。除了“仿佛”规则。