Каковы все возможные типы допустимых выражений для аргумента по умолчанию в функции или функции-члене?
Допустимые выражения для аргументов функции по умолчанию
Ответы (2)
Все, что правильно в контексте присвоения переменной типа параметра функции.
Редактировать
Аргументы по умолчанию во время компиляции оцениваются с точки зрения правильности типов и т. д., но они не вычисляются, и назначение не выполняется до времени выполнения. Вы можете указать конструктор еще не определенного класса в качестве аргумента по умолчанию, и это нормально, если класс определен в точке использования функции... Фактическое вычисление/назначение происходит во время вызова функции, а не в точке объявления/определения функции.
Пример:
#include <iostream>
void foo( int a = std::rand())
{
std::cout << a << std::endl;
}
int main( void )
{
foo();
return( 0 );
}
Вывод программы на ideone.com:
1804289383
int a = std::rand()
, но не можете сделать void Class::foo(int a = std::rand())
.
- person Emile Cormier; 15.02.2012
Это подробно описано в разделе 8.3.6 стандарта C++03. По сути, это любое выражение, которое не зависит ни от чего в локальной области видимости, поэтому любое выражение, зависящее от локальных переменных, параметров функции или «этого», исключается.
void()
. К сожалению, Visual C++ 10.0 принимает это. Кроме этого, нет никаких ограничений на выражения аргументов по умолчанию по сравнению с выражениями в целом. (За исключением случаев, когда вы имеете в виду некопируемые типы или что-то подобное, что является ограничением не на тип выражения, а на тип). Если вас интересуют синтаксические категории, обратитесь к грамматике C++ BNF. Ура и чт. - person Cheers and hth. - Alf   schedule 15.02.2012