2016-03-17 2 views
2

Учитывая функцию с неиспользованным (и безымянным) аргументом:Неиспользуемые неиспользуемые аргументы функции?

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

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

ли аргумент гарантированно быть реализовано, или компилятор позволил оптимизировать его подальше?

+0

В чем разница? –

+0

Конструктор может иметь побочные эффекты. – user5434231

+3

@ user5434231: добавьте побочный эффект к вашему примеру кода. Если побочных эффектов нет, тогда ответ становится слишком тривиальным, поскольку правило as-if допускает все оптимизации. –

ответ

4

С [class.temp]:

Когда реализация вводит временный объект класса, который имеет нетривиальный конструктор (12,1, 12,8), он должен убедиться, что конструктор вызывается для временный объект.

Стандарт также обеспечивает в [intro.execution]:

Скорее, соответствуя реализации требуются для эмуляции (только) наблюдаемое поведение абстрактной машины, как объяснено ниже .


Это положение иногда называют «как если бы» правила, потому что реализация может свободно игнорировать любые требования настоящего международного стандарта до тех пор, как результат, как если бы требование было повиновались , насколько это можно определить из наблюдаемого поведения программы . Например, фактическая реализация не должна оценивать часть выражения , если она может вывести, что ее значение не используется и что никаких побочных эффектов, влияющих на наблюдаемое поведение программы, не получается.

Конечно, приобретая замок квалифицируется как побочный эффект, затрагивающий наблюдаемое поведение, так что да, аргумент гарантированно быть реализован, поскольку он имеет нетривиальный конструктор с наблюдаемыми побочными эффектами.

+1

Кроме правила as-if. – juanchopanza

Смежные вопросы