给定一个带有未使用(和未命名)参数的函数:
template <typename T> void f(T&&) { /* do something, without using T */ }
int main()
{
std::mutex m;
f(std::lock_guard<std::mutex> { m });
}
参数是否可以保证实例化,或者是否允许编译器对其进行优化?
答案 0 :(得分:4)
来自[class.temp]:
当实现引入具有非平凡构造函数(12.1,12.8)的类的临时对象时,应确保为临时对象调用构造函数。
该标准还提供了[intro.execution]:
相反,符合 如下所述,实现需要模拟(仅)抽象机器的可观察行为 下方。 5
<小时/> 5 这项规定有时被称为“as-if”规则,因为实施可以自由地忽略对此的任何要求 国际标准,只要结果就好像已经遵守了要求,只要可以从中确定 程序的可观察行为。例如,如果可以的话,实际实现不需要评估表达式的一部分 推断其价值未被使用,且不会产生影响程序可观察行为的副作用。
当然,获取锁有资格作为影响可观察行为的副作用,所以是的,该参数保证被实例化,因为它具有带有可观察副作用的非平凡构造函数。