簡體   English   中英

默認情況下是默認構造函數/賦值noexcept / constexpr嗎?

[英]Is a defaulted constructor/assignment noexcept/constexpr by default?

所以,我的問題很簡單:

將默認類構造函數指定為noexceptconstexpr (或任何其他可能的東西)是否有任何意義?

struct foo
{
   foo() = default;
   // vs
   constexpr foo() noexcept = default;

   // same thing would apply for copy/move ctors and assignment operators
};

兩者的行為方式是否相同?

這取決於課程是否為POD? 例如,使用上面的示例,兩者的行為方式相同,而如果我有一個私有成員std::vector<int> v = { 1, 2, 3, 4 }; 它使用類內賦值, foo() = default; 默認情況下不是noexcept而不是constexpr

通過編寫foo() = default; 編譯器是否選擇了最好的版本:如果可能的話, noexcept和盡可能的constexpr等等?

[dcl.fct.def.default] / 2-3

2未被定義為刪除的明確,違約函數可以聲明constexpr只有它會被隱含聲明為constexpr 如果函數在其第一個聲明中明確默認,

  • 如果隱式聲明是,則隱含地認為是constexpr ,並且,
  • 它具有相同的異常規范,就好像它已被隱式聲明([except.spec])。

3如果使用異常規范 ([except.spec])使用隱式聲明的異常規范聲明顯式默認的函數,則

  • 如果函數在其第一個聲明中明確默認,則將其定義為已刪除;

  • 否則,該計划是不正確的。

換句話說, foo() = default; ,這必然是foo默認構造函數的第一個聲明,如果可能的話,將是“ constexpr ”,如果可能的話,將是“ noexcept ”。 明確寫constexprnoexcept仍然有用; 它意味着“如果它不能是constexpr / noexcept就會對我大喊大叫”。

暫無
暫無

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

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