Я использую вектор STL, который является вектором параметров.
std::vector<Parameter> foo;
Я пытался найти способ добавить объекты Parameter в вектор, не делая этого:
Parameter a;
foo.push_back(a);
Я наткнулся на реализацию, которая сделала это:
foo.push_back(Parameter()); //Using the Parameter constructor
Я думал, что когда я создал объект, конструктор называется не наоборот. Почему я могу передать конструктор функции?
foo.push_back(Parameter());
передает временно построенный объект Parameter push_back
а не конструктор, т.е. Parameter()
это вызов для создания объекта типа Parameter
в стеке и передать его push_back
функция vector
где он перемещается / копируется. Таким образом, передается не сам конструктор, а только сконструированный объект.
Это просто сокращенный способ написания Parameter a; foo.push_back(a);
когда кто-то уверен, что a
нигде не используется; вместо объявления фиктивной временной переменной создается и передается анонимная временная переменная.
Это может быть полезно, если вы хотите узнать больше о временных:
http://www.informit.com/guides/content.aspx?g=cplusplus&SEQNUM = 198
http://msdn.microsoft.com/en-us/library/a8kfxa78%28v=vs.80%29.aspx
Эта строка создаст временный экземпляр Parameter
и скопировать его в Foo
, Предполагая, что это код до C ++ 11. Новый std::vector<T>::push_back
имеет перегрузку для rvalues, в этом случае не будет копий.
когда ты звонишь Parameter()
временный объект создается и передается foo.push_back()
функция. Ранее вы объявили объект с именем Parameter a;
и передал это так foo.push_back(a)
, Делая так, вы можете использовать объект с именем a
вниз по линии вашей программы.
Вы не передаете конструктор, а вместо этого передаете временный объект. Когда вы делаете Paramater()
из-за фарантеза он создает объект. Например, вызов функции getInput()
,
Другой момент, который мы здесь упускаем, заключается в том, что для передачи функции в качестве параметра вы вообще не используете скобки. Вот пример передачи функции в качестве параметра:
#include <algorithm>
#include <vector>
#include <iostream>
// initialise sum and summing function
int sum = 0;
void sum_numbers( const int& number );
// Create a test for our sum function
int main(int argc, const char * argv[])
{
// create some numbers
std::vector<int> numbers;
numbers.push_back( 34 );
numbers.push_back( 73 );
numbers.push_back( 14 );
// passing "sum_numbers" function as a parameter
std::for_each( numbers.begin(), numbers.end(), sum_numbers );
// check that our sum function worked
std::cout << "The sum of numbers is: " << sum << std::endl;
return 0;
}
// add the current number to the sum
void sum_numbers( const int& number )
{
sum += number;
}