簡體   English   中英

C++ 中的默認函數參數必須是常量嗎?

[英]Must default function parameters be constant in C++?

void some_func(int param = get_default_param_value());

默認參數可以是完整表達式集的子集。 它必須在編譯時和默認參數的聲明位置綁定。 這意味着它可以是函數調用或靜態方法調用,並且可以采用任意數量的參數,只要它們是常量和/或全局變量或靜態類變量,但不是成員屬性。

它在編譯時和函數聲明的地方綁定的事實也意味着如果它使用一個變量,即使不同的變量在函數調用的地方遮蔽了原始變量,也會使用該變量。

// Code 1: Valid and invalid default parameters
int global = 0;
int free_function( int x );

class Test
{
public:
   static int static_member_function();
   int member_function();

   // Valid default parameters
   void valid1( int x = free_function( 5 ) );
   void valid2( int x = free_function( global ) );
   void valid3( int x = free_function( static_int ) );
   void valid4( int x = static_member_function() );

   // Invalid default parameters
   void invalid1( int x = free_function( member_attribute ) ); 
   void invalid2( int x = member_function() );
private:
   int member_attribute;
   static int static_int;
};

int Test::static_int = 0;

// Code 2: Variable scope
int x = 5;
void f( int a );
void g( int a = f( x ) ); // x is bound to the previously defined x
void h()
{
   int x = 10; // shadows ::x
   g(); // g( 5 ) is called: even if local x values 10, global x is 5.
}

他們不必是! 默認參數可以是特定限制范圍內的任何表達式。 每次調用函數時都會對其進行評估。

David Rodríguez - dribeas answear 很棒,但沒有提供解決方案。
看起來似乎沒有解決方案。

解決方案很簡單:用函數/方法重載替換默認參數。

void some_func(int param);
void some_func() {
    some_func(get_default_param_value());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM