2017-02-04 5 views

ответ

0

Если у меня не функция члена constexpr принимая ссылочный параметр у него есть быть постоянной ссылкой?

Нет, это не так, но это лучше.

Основная цель функции constexpr - оценивать выражения во время компиляции. Не имеет смысла передавать ссылку на такую ​​функцию не const. Если вы решите изменить входной объект в функции, я должен спросить вас, почему? Если вы не изменяете входной объект, лучше использовать ссылку const, так же как всегда полезно создавать функции-члены, которые не изменяют объект, чтобы быть функциями-членами const.

Следующий код не работает, так как временный объект не может быть использован, когда функция ожидает Непро- const присвоенного

struct Foo { int i; }; 

constexpr bar(Foo& f) { return f.i * 2; } 

int main() 
{ 
    int arr[bar({20})]; // Can't use a temp object 
} 

Следующий код работает. Эта функция может использоваться как с временными объектами, так и с объектами, которые могут использоваться как lvalues.

struct Foo { int i; }; 

constexpr bar(Foo const& f) { return f.i * 2; } 

int main() 
{ 
    int arr[bar({20})]; 
    Foo f{20}; 
    int v = bar(f); 
} 
+0

Любые ссылки или ссылки –

+0

@BlairDavidson, я добавил немного больше описание, чтобы объяснить свою «лучшую» квалификацию. Надеюсь, это имеет смысл. –

0

Короткий ответ: Нет

Длинный ответ: Нет, потому что оператор const только гарантирует, что данные функции, не являющихся членами не будет изменен - ​​однако, если вы передаете параметр , этот внешний параметр может быть изменен