未使用的函数参数是否总是被实例化?

时间:2016-03-17 16:11:24

标签: c++

给定一个带有未使用(和未命名)参数的函数:

template <typename T> void f(T&&) { /* do something, without using T */ }

int main() 
{
    std::mutex m;
    f(std::lock_guard<std::mutex> { m });
}

参数是否可以保证实例化,或者是否允许编译器对其进行优化?

1 个答案:

答案 0 :(得分:4)

来自[class.temp]:

  

当实现引入具有非平凡构造函数(12.1,12.8)的类的临时对象时,应确保为临时对象调用构造函数。

该标准还提供了[intro.execution]:

  

相反,符合   如下所述,实现需要模拟(仅)抽象机器的可观察行为   下方。 5
  

<小时/>    5 这项规定有时被称为“as-if”规则,因为实施可以自由地忽略对此的任何要求   国际标准,只要结果就好像已经遵守了要求,只要可以从中确定   程序的可观察行为。例如,如果可以的话,实际实现不需要评估表达式的一部分   推断其价值未被使用,且不会产生影响程序可观察行为的副作用

当然,获取锁有资格作为影响可观察行为的副作用,所以是的,该参数保证被实例化,因为它具有带有可观察副作用的非平凡构造函数。