Допустимые выражения для аргументов функции по умолчанию

Каковы все возможные типы допустимых выражений для аргумента по умолчанию в функции или функции-члене?


person Emile Cormier    schedule 15.02.2012    source источник
comment
Вам нужно быть намного более конкретным.   -  person Kenneth Funk    schedule 15.02.2012
comment
Мой вопрос намеренно общий. Я хочу знать, какие типы выражений я могу использовать в качестве аргумента по умолчанию. SO — это не просто просьба о помощи в исправлении ошибки.   -  person Emile Cormier    schedule 15.02.2012
comment
msdn.microsoft.com/en-us/library/e1dbzf09.aspx   -  person Anthony Sottile    schedule 15.02.2012
comment
¤ Одно специальное выражение, которое вы не можете использовать, это void(). К сожалению, Visual C++ 10.0 принимает это. Кроме этого, нет никаких ограничений на выражения аргументов по умолчанию по сравнению с выражениями в целом. (За исключением случаев, когда вы имеете в виду некопируемые типы или что-то подобное, что является ограничением не на тип выражения, а на тип). Если вас интересуют синтаксические категории, обратитесь к грамматике C++ BNF. Ура и чт.   -  person Cheers and hth. - Alf    schedule 15.02.2012


Ответы (2)


Все, что правильно в контексте присвоения переменной типа параметра функции.

Редактировать
Аргументы по умолчанию во время компиляции оцениваются с точки зрения правильности типов и т. д., но они не вычисляются, и назначение не выполняется до времени выполнения. Вы можете указать конструктор еще не определенного класса в качестве аргумента по умолчанию, и это нормально, если класс определен в точке использования функции... Фактическое вычисление/назначение происходит во время вызова функции, а не в точке объявления/определения функции.

Пример:

#include <iostream>

void foo( int a = std::rand())
{
  std::cout << a << std::endl;
}

int main( void )
{
 foo();

 return( 0 );
}

Вывод программы на ideone.com:

1804289383

person lapk    schedule 15.02.2012
comment
Это неверно. Вы можете назначать переменным вещи, которые могут быть определены только во время выполнения, но вы не сможете использовать их в качестве аргументов по умолчанию. Например, вы можете сделать int a = std::rand(), но не можете сделать void Class::foo(int a = std::rand()). - person Emile Cormier; 15.02.2012
comment
Ой, извините. Я снова позволяю своим ложным предубеждениям взять верх надо мной. - person Emile Cormier; 15.02.2012
comment
@EmileCormier Аргументы по умолчанию во время компиляции оцениваются с точки зрения правильности типа и т. Д., Но они не вычисляются, и до времени выполнения не выполняется присвоение. Вы можете указать конструктор еще не определенного класса в качестве аргумента по умолчанию, и это нормально, если класс определен в точке использования функции... Фактическое вычисление/назначение происходит во время вызова функции, а не в точке объявления/определения функции. - person lapk; 15.02.2012
comment
+1 Спасибо за разъяснение, и еще раз извините за мои сумасшедшие выходки. :-) - person Emile Cormier; 15.02.2012

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

person Vaughn Cato    schedule 15.02.2012
comment
Это очень хорошо дополняет ответ AzzA. Хотел бы я принять оба ответа. - person Emile Cormier; 15.02.2012