颿°å®£è¨
颿°å®£è¨ã¯é¢æ°ã®ååã¨ãã®åãå°å ¥ãã¾ãã 颿°å®ç¾©ã¯é¢æ°ã®åå/åã颿°ã®æ¬ä½ã¨ç´ä»ãã¾ãã
ç®æ¬¡ |
[ç·¨é] 颿°å®£è¨
颿°å®£è¨ã¯ä»»æã®ã¹ã³ã¼ãã«ç¾ãããã¨ãã§ãã¾ãã ã¯ã©ã¹ã¹ã³ã¼ãã®é¢æ°å®£è¨ã¯ã¯ã©ã¹ã¡ã³ã颿°ãå°å ¥ãã¾ã (friend æå®åã使ç¨ãããå ´åãé¤ãã¾ã) (詳細ã¯ã¡ã³ã颿°ããã³ãã¬ã³ã颿°ãåç §ãã¦ãã ãã)ã
宣è¨ããã¦ãã颿°ã®åã¯æ»ãå¤ã®å (宣è¨ã®æ§æã® decl-specifier-seq ã«ãã£ã¦æä¾ããã¾ã) ããã³é¢æ°ã® declarator ããæ§æããã¾ãã
noptr-declarator ( parameter-list ) cv(ãªãã·ã§ã³) ref(ãªãã·ã§ã³) except(ãªãã·ã§ã³) attr(ãªãã·ã§ã³)
|
(1) | ||||||||
noptr-declarator ( parameter-list ) cv(ãªãã·ã§ã³) ref(ãªãã·ã§ã³) except(ãªãã·ã§ã³) attr(ãªãã·ã§ã³) -> trailing
|
(2) | (C++11以ä¸) | |||||||
(declarator ã®æ§æã®ä»ã®å½¢å¼ã«ã¤ãã¦ã¯å®£è¨ãåç §ãã¦ãã ããã)
auto
ãå«ã¾ãªããã°ãªãã¾ãããnoptr-declarator | - | ä»»æã®æå¹ãª declaratorã ãã ã *ã & ã¾ã㯠&& ã§å§ã¾ãå ´åã¯æ¬å¼§ã§å²ãå¿ è¦ãããã¾ãã |
parameter-list | - | 颿°ã®å¼æ°ã®ã³ã³ãåºåãã®ãªã¹ã (空ã§ãæ§ãã¾ãã) (詳細ã¯å¾è¿°)ã |
attr(C++11) | - | ãªãã·ã§ãã«ãªå±æ§ã®ãªã¹ãã ãããã®å±æ§ã¯é¢æ°èªèº«ã§ã¯ãªã颿°ã®åã«é©ç¨ããã¾ãã 颿°ã«å¯¾ãã屿§ã¯å®£è¨åå ã®èå¥åã®å¾ã«ç¾ãã宣è¨ã®å é ã«ç¾ãã屿§ (ããããã°) ã¨çµã¿åãããã¾ãã |
cv | - | const/volatile 修飾ã ééçã¡ã³ã颿°ã®å®£è¨ã§ã®ã¿ä½¿ç¨ã§ãã¾ãã |
ref(C++11) | - | åç §ä¿®é£¾ã ééçã¡ã³ã颿°ã®å®£è¨ã§ã®ã¿ä½¿ç¨ã§ãã¾ãã |
except | - | åçä¾å¤æå®(C++17æªæº)ã¾ã㯠noexcept æå®å(C++11)ã®ããããã ä¾å¤æå®ã¯é¢æ°ã®åã®ä¸é¨ã§ã¯ãªããã¨ã«æ³¨æãã¦ãã ããã (C++17æªæº) |
trailing(C++11) | - | å¾ç½®æ»ãå¤åã template <class T, class U> auto add(T t, U u) -> decltype(t + u); ã®ããã«æ»ãå¤åã弿°åã«ä¾åããå ´åãã auto fpif(int)->int(*)(int) ã®ããã«è¤éãªå ´åã«ä¾¿å©ã§ãã |
宣è¨ã§è¿°ã¹ããã¦ããããã«ã宣è¨åã¯å¾ãã« requires ç¯ãç¶ãããã¨ãã§ãã¾ãã ããã¯é¢æ°ã«å¯¾ãã¦ç´ä»ããå¶ç´ã宣è¨ãã¾ãã å¶ç´ã¯é¢æ°ããªã¼ãã¼ãã¼ã解決ã«ãã£ã¦é¸æãããããã«æºããããªããã°ãªãã¾ãã (ä¾ãã° void f1(int a) requires true;)ã ç´ä»ããããå¶ç´ã¯é¢æ°ã®ã·ã°ããã£ã®ä¸é¨ã§ããã颿°ã®åã®ä¸é¨ã§ã¯ãªããã¨ã«æ³¨æãã¦ãã ããã |
(C++20以ä¸) |
颿°ã®å®£è¨åã¯ã decl-specifier-seq ã許ãå ´åã¯ãä»ã®å®£è¨åã¨æ··ãããã¨ãã§ãã¾ãã
// intã int*ã颿°ãããã³é¢æ°ã¸ã®ãã¤ã³ã¿ã宣è¨ãã¾ãã int a = 1, *p = NULL, f(), (*pf)(double); // decl-specifier-seq 㯠int ã§ãã // 宣è¨å f() ã¯å¼æ°ãåãã int ãè¿ã颿°ã宣è¨ãã¾ã (ãå®ç¾©ã¯ãã¾ãã)ã struct S { virtual int f(char) const, g(int) &&; // 2ã¤ã®ééçã¡ã³ã颿°ã宣è¨ãã¾ãã virtual int f(char), x; // ã³ã³ãã¤ã«æã¨ã©ã¼ã (decl-specifier-seq å ã®) virtual 㯠// ééçã¡ã³ã颿°ã®å®£è¨ã§ã®ã¿ä½¿ç¨ã§ãã¾ãã };
颿°ã®æ»ãå¤ã®åã颿°åã¾ãã¯é ååã«ãããã¨ã¯ã§ãã¾ãã (ãããããã¸ã®ãã¤ã³ã¿ã¾ãã¯åç §ã«ãããã¨ã¯ã§ãã¾ã)ã
ãããã宣è¨ã¨åæ§ã«ããã®å®£è¨ã®åã«ç¾ãã屿§ããã³å®£è¨åå ã®èå¥åã®ç´å¾ã«ç¾ãã屿§ã¯ã©ã¡ãã宣è¨ã¾ãã¯å®ç¾©ããã¦ããã¨ã³ãã£ã㣠(ãã®å ´åã¯é¢æ°) ã«é©ç¨ããã¾ãã [[noreturn]] void f [[noreturn]] (); // OKã両æ¹ã®å±æ§ã颿° f ã«é©ç¨ããã¾ãã ãããã (ä¸ã®æ§æã®) 宣è¨åã®å¾ã«ç¾ãã屿§ã¯ã颿°èªèº«ã§ã¯ãªã颿°ã®åã«é©ç¨ããã¾ãã void f() [[noreturn]]; // ã¨ã©ã¼ããã®å±æ§ã¯åã«å¯¾ãã¦ã¯å¹æãããã¾ããã |
(C++11以ä¸) |
ãããã宣è¨ã¨åæ§ã«ã ret func(params)
ã¨ãã¦å®£è¨ããã颿° func
ã®å㯠ret(params)
ã§ã (ä¸ã§èª¬æããã¦ãã弿°ã®åã®æ¸ãæãã¯é¤ãã¾ã) (åã®ååä»ããåç
§ãã¦ãã ãã)ã
æ»ãå¤ã®åã®æ¨å®é¢æ°å®£è¨ã® decl-specifier-seq ããã¼ã¯ã¼ã int x = 1; auto f() { return x; } // æ»ãå¤ã®å㯠int ã§ãã const auto& f() { return x; } // æ»ãå¤ã®å㯠const int& ã§ãã æ»ãå¤ã®åã int x = 1; decltype(auto) f() { return x; } // æ»ãå¤ã®å㯠int (decltype(x) ã¨åã) ã§ãã decltype(auto) f() { return(x); } // æ»ãå¤ã®å㯠int& (decltype((x)) ã¨åã) ã§ãã (ãã¼ã: ã è¤æ°ã® return æãããå ´åã¯ããã¹ã¦åãåã«æ¨å®ãããªããã°ãªãã¾ããã auto f(bool val) { if (val) return 123; // æ»ãå¤ã®å㯠int ã¨æ¨å®ããã¾ãã else return 3.14f; // ã¨ã©ã¼ãæ»ãå¤ã®å㯠float ã¨æ¨å®ããã¾ãã } return æããªãå ´åã¾ã㯠return æã®å¼æ°ã void å¼ã®å ´åãæ¨å®ãããæ»ãå¤ã®å㯠decltype(auto) ã¾ã㯠auto (cv 修飾ããã¦ãã¦ãæ§ãã¾ãã) ã®ããããã§ãªããã°ãªãã¾ããã åè ã®å ´åãæ¨å®ãããæ»ãå¤ã®å㯠void ã§ãã å¾è ã®å ´åãæ¨å®ãããæ»ãå¤ã®å㯠(åãã« cv 修飾ããã) void ã§ãã auto f() {} // void ãè¿ãã¾ãã auto g() { return f(); } // void ãè¿ãã¾ãã auto* x() {} // ã¨ã©ã¼ã void ãã auto* ãæ¨å®ã§ãã¾ããã ãã£ãã颿°å ã« return æãè¦ã¤ãã£ããããã®æããæ¨å®ãããæ»ãå¤ã®åããã®é¢æ°ã®æ®ãã®é¨å (ä»ã® return æãå«ã) ã§ä½¿ç¨ã§ãã¾ãã auto sum(int i) { if (i == 1) return i; // sum ã®æ»ãå¤ã®å㯠int ã§ãã else return sum(i - 1) + i; // OKã sum ã®æ»ãå¤ã®åã¯ãã§ã«å¤æãã¦ãã¾ãã } return æãæ³¢æ¬å¼§åæååãªã¹ãã使ç¨ããå ´åãæ¨å®ã¯ã§ãã¾ããã auto func () { return {1, 2, 3}; } // ã¨ã©ã¼ã ä»®æ³é¢æ°ã¯æ»ãå¤ã®åã®æ¨å®ã使ç¨ã§ãã¾ããã struct F { virtual auto f() { return 2; } // ã¨ã©ã¼ã }; 颿°ãæ»ãå¤ã®åã®æ¨å®ã使ç¨ããå ´åã¯ããã¨ãåãåã«æ¨å®ãããå ´åã§ããæ¨å®å¾ã®åãå¥ã®ç¨®é¡ã®æ»ãå¤ã®åã®æ¨å®ãç¨ãã¦å宣è¨ãããã¨ã¯ã§ãã¾ããã auto f(); // 宣è¨ãããããã©ãã¾ã å®ç¾©ããã¦ãã¾ããã auto f() { return 42; } // å®ç¾©ã æ»ãå¤ã®å㯠int ã§ãã int f(); // ã¨ã©ã¼ãæ¨å®å¾ã®åã¯ä½¿ç¨ã§ãã¾ããã decltype(auto) f(); // ã¨ã©ã¼ãç°ãªã種é¡ã®æ¨å®ã auto f(); // OKãå宣è¨ã template<typename T> struct A { friend T frf(T); }; auto frf(int i) { return i; } // A<int> ã®ãã¬ã³ãã§ã¯ããã¾ããã ã¦ã¼ã¶å®ç¾©å¤æé¢æ°ä»¥å¤ã®é¢æ°ãã³ãã¬ã¼ãã¯æ»ãå¤ã®åã®æ¨å®ã使ç¨ã§ãã¾ãã æ¨å®ã¯ããã¨ã return æã®å¼ãä¾åã§ãªãã¦ããå®ä½åæã«è¡ããã¾ãã ãã®å®ä½å㯠SFINAE ã®ç®çã«å¯¾ãã¦ã¯å³ææèã§ã¯ããã¾ããã template<class T> auto f(T t) { return t; } typedef decltype(f(1)) fint_t; // æ»ãå¤ã®åãæ¨å®ããããã« f<int> ãå®ä½åãã¾ãã template<class T> auto f(T* t) { return *t; } void g() { int (*p)(int*) = &f; } // æ»ãå¤ã®åãæ¨å®ããããã«ä¸¡æ¹ã® f ãå®ä½åãã // 2ã¤ãã®ãã³ãã¬ã¼ããªã¼ãã¼ãã¼ãã鏿ãã¾ãã æ»ãå¤ã®åã®æ¨å®ãç¨ãã颿°ãã³ãã¬ã¼ãã®ç¹æ®åã¯ãåãæ»ãå¤ã®åã®ãã¬ã¼ã¹ãã«ãã使ç¨ããªããã°ãªãã¾ããã template<typename T> auto g(T t) { return t; } // #1 template auto g(int); // OKãæ»ãå¤ã®å㯠int ã§ãã //template char g(char); // ã¨ã©ã¼ãããããããã³ãã¬ã¼ããããã¾ããã template<> auto g(double); // OKãæ»ãå¤ã®åã䏿ãªåæ¹å®£è¨ã template<typename T> T g(T t) { return t; } // OKã #1 ã¨åçã§ã¯ããã¾ããã template char g(char); // OKãä»åã¯ããããããã³ãã¬ã¼ããããã¾ãã template auto g(float); // ã¾ã #1 ã«ããããã¾ãã //void h() { return g(42); } // ã¨ã©ã¼ãææ§ã§ãã æç¤ºçå®ä½åã®å®£è¨ããèªèº«ã¯æ»ãå¤ã®åã®æ¨å®ã使ç¨ãã颿°ãã³ãã¬ã¼ããå®ä½åãã¾ããã template<typename T> auto f(T t) { return t; } extern template auto f(int); // f<int> ãå®ä½åãã¾ããã int (*p)(int) = f; // æ»ãå¤ã®åãæ±ºå®ããããã« f<int> ãå®ä½åãã¾ããã // ããã°ã©ã å ã®ã©ããã«æç¤ºçå®ä½åã®å®ç¾©ã // å¿ è¦ãªãã¨ã¯å¤ããã¾ããã |
(C++14以ä¸) |
[ç·¨é] 弿°ãªã¹ã
弿°ãªã¹ãã¯ãã®é¢æ°ãå¼ã°ããã¨ãã«æå®ã§ãã弿°ã決å®ãã¾ãã ããã¯å¼æ°å®£è¨ã®ã³ã³ãåºåãã®ãªã¹ãã§ããããã®ããããã¯ä»¥ä¸ã®æ§æãæã¡ã¾ãã
attr(ãªãã·ã§ã³) decl-specifier-seq declarator | (1) | ||||||||
attr(ãªãã·ã§ã³) decl-specifier-seq declarator = initializer
|
(2) | ||||||||
attr(ãªãã·ã§ã³) decl-specifier-seq abstract-declarator(ãªãã·ã§ã³) | (3) | ||||||||
attr(ãªãã·ã§ã³) decl-specifier-seq abstract-declarator(ãªãã·ã§ã³) = initializer
|
(4) | ||||||||
void
|
(5) | ||||||||
int f(int a, int *p, int (*(*x)(double))[3]);
int f(int a = 7, int *p = nullptr, int (*(*x)(double))[3] = nullptr);
int f(int, int *, int (*(*)(double))[3]);
int f(int = 7, int * = nullptr, int (*(*)(double))[3] = nullptr);
void
å (cv 修飾ããã¦ããå ´åãå«ã¿ã¾ã) ã¯å¼æ°ãªã¹ãã§ä½¿ç¨ã§ããªããã¨ã«æ³¨æãã¦ãã ããã int f(void, int); ã int f(const void); ã¯ã¨ã©ã¼ã§ã (void*
ãªã©ã®æ´¾çåã¯ä½¿ç¨ã§ãã¾ã)ã ãã³ãã¬ã¼ãã§ã¯ãéä¾å㪠void åã®ã¿ã使ç¨ã§ãã¾ã (å T
ã®å¼æ°1åãåã颿°ã¯ã T = void
ã§å®ä½åãããå ´åã弿°ãªãã®é¢æ°ã«ãªãã¾ãã)ã (C++11以ä¸)弿°ãªã¹ãã®æå¾ã«çç¥è¨å· ...
ãä»ãã¦ãæ§ãã¾ããã ããã¯å¯å¤é·å¼æ°é¢æ°ã宣è¨ãã¾ãã
int printf(const char* fmt ...);
C89 ã¨ã®äºææ§ã®ããã弿°ãªã¹ãã«å°ãªãã¨ã1åã®å¼æ°ãããå ´åã¯ãçç¥è¨å·ã®åã«ãªãã·ã§ãã«ãªã³ã³ããä»ãã¦ãæ§ãã¾ããã
int printf(const char* fmt, ...); // OKãä¸ã¨åãã§ãã
decl-specifier-seq ã¯åæå®å以å¤ã®æå®åãåå¨ãå¾ããã¨ãæç¤ºãã¾ãããä»ã«æå®å¯è½ãªæå®å㯠register 㨠auto (C++11æªæº) ã ãã§ããã广ã¯ããã¾ããã |
(C++17æªæº) |
颿°ã®å¼æ°ã®ããããããã¬ã¼ã¹ãã«ã ( void f1(auto); // template<class T> void f(T) ã¨åãã§ãã void f2(C1 auto); // template<C1 T> void f7(T) ã¨åãã§ã (C1 ãã³ã³ã»ããã®å ´å)ã |
(C++20以ä¸) |
颿°ã®å®£è¨ã§å®£è¨ããã弿°ã®ååã¯ãé常ãèªå·±ææ¸åã®ç®çã®ããã ãã§ãã ãããã¯é¢æ°ã®å®ç¾©ã§ä½¿ç¨ããã¾ã (ãããªãã·ã§ãã«ãªã¾ã¾ã§ã)ã
弿°ãªã¹ãã®ããããã®é¢æ°ã®å¼æ°ã®åã¯ã以ä¸ã®ã«ã¼ã«ã«å¾ã£ã¦æ±ºå®ããã¾ãã
ãããã®ã«ã¼ã«ã«ããã以ä¸ã®é¢æ°å®£è¨ã¯æ£ç¢ºã«åã颿°ã宣è¨ãã¦ãã¾ãã
int f(char s[3]); int f(char[]); int f(char* s); int f(char* const); int f(char* volatile s);
以ä¸ã®å®£è¨ãæ£ç¢ºã«åã颿°ã宣è¨ãã¦ãã¾ãã
int f(int()); int f(int (*g)());
å¢çã䏿ãªé åã¸ã®åç §ã¾ãã¯ãã¤ã³ã¿ (ãã®ãããªåã®å¤æ®µãã¤ã³ã¿/é åãã¾ãã¯å¼æ°ããã®ãããªåã®é¢æ°ã¸ã®ãã¤ã³ã¿ãå«ã¿ã¾ã) ãå«ãåã弿°ã®åã¨ãããã¨ã¯ã§ãã¾ããã |
(C++14æªæº) |
å¯å¤é·å¼æ°ã表ãçç¥è¨å·ã¯ããã¨ããã©ã¡ã¼ã¿ããã¯ã®å±éã表ãçç¥è¨å·ã®å¾ã§ãã£ã¦ããã³ã³ããåã«ã¤ããå¿ è¦ã¯ããã¾ããã ãã®ããã以ä¸ã®é¢æ°ãã³ãã¬ã¼ãã¯æ£ç¢ºã«åãã§ãã template<typename ...Args> void f(Args..., ...); template<typename ...Args> void f(Args... ...); template<typename ...Args> void f(Args......); ãã®ãããªå®£è¨ã使ç¨ãããä¾ã¯ã std::is_function ã®å®è£ ã§ãã |
(C++11以ä¸) |
[ç·¨é] 颿°å®ç¾©
éã¡ã³ã颿°ã®å®ç¾©ã¯åå空éã¹ã³ã¼ãã«ã®ã¿ç¾ãããã¨ãã§ãã¾ã (ãã¹ããã颿°ã¯åå¨ãã¾ãã)ã ã¡ã³ã颿°ã®å®ç¾©ã¯ã¯ã©ã¹å®ç¾©ã®æ¬ä½å ã«ãç¾ãããã¨ãã§ãã¾ãã ãããã¯ä»¥ä¸ã®æ§æãæã¡ã¾ãã
attr(ãªãã·ã§ã³) decl-specifier-seq(ãªãã·ã§ã³) declarator virt-specifier-seq(ãªãã·ã§ã³) function-body | |||||||||
ãã ã function-body ã¯ä»¥ä¸ã®ããããã§ãã
ctor-initializer(ãªãã·ã§ã³) compound-statement | (1) | ||||||||
function-try-block | (2) | ||||||||
= delete ;
|
(3) | (C++11以ä¸) | |||||||
= default ;
|
(4) | (C++11以ä¸) | |||||||
attr(C++11) | - | ãªãã·ã§ãã«ãªå±æ§ã®ãªã¹ãã ãããã®å±æ§ã¯ declarator å ã®èå¥åã®å¾ã®å±æ§ (ããããã°) ã¨çµã¿åãããã¾ã (ãã®ãã¼ã¸ã®ããããåç §ãã¦ãã ãã)ã |
decl-specifier-seq | - | æå®åä»ãã®æ»ãå¤ã®åã 宣è¨ã®ææ³ã®å ´åã¨åæ§ã§ãã |
declarator | - | 颿°å®£è¨åã ä¸è¨ã®é¢æ°å®£è¨ã®ææ³ã®å ´åã¨åãã§ãã 颿°å®£è¨ã®å ´åã¨åæ§ã«ãå¾ãã« requires-clause ãç¶ãããã¨ãã§ãã¾ãã (C++20以ä¸) |
virt-specifier-seq(C++11) | - | overrideã final ã¾ãã¯ãã®é ä¸åã®çµã¿åãã (ã¡ã³ã颿°ã«å¯¾ãã¦ã®ã¿ä½¿ç¨ã§ãã¾ã)ã |
ctor-initializer | - | ã¡ã³ãåæååãªã¹ãã ã³ã³ã¹ãã©ã¯ã¿ã§ã®ã¿ä½¿ç¨ã§ãã¾ãã |
compound-statement | - | 颿°ã®æ¬ä½ãæ§æãããæ³¢æ¬å¼§ã§å²ã¾ããæã®ä¸¦ã³ã |
int max(int a, int b, int c) { int m = (a > b)? a : b; return (m > c)? m : c; } // decl-specifier-seq ã¯ãintãã§ãã // 宣è¨åã¯ãmax(int a, int b, int c)ãã§ãã // æ¬ä½ã¯ { ... } ã§ãã
颿°ã®æ¬ä½ã¯è¤æ (æ³¢æ¬å¼§ã®çµã§å²ã¾ãã0å以ä¸ã®æã®ä¸¦ã³) ã§ããã颿°å¼ã³åºããè¡ãããã¨ãã«å®è¡ããã¾ãã
颿°ã®å¼æ°ã®åããã³æ»ãå¤ã®åã¯ãåé¤ããã颿°ãé¤ã (C++11以ä¸)ä¸å®å ¨ã¯ã©ã¹åã«ã§ãã¾ããã å®å ¨æ§ã®ãã§ãã¯ã¯é¢æ°ã®æ¬ä½ã®æèã§è¡ããã¾ãã ããã¯ããã¨ãå®ç¾©ã®æç¹ã§ä¸å®å ¨ã§ãã£ã¦ã (颿°ã®æ¬ä½å ã§ã¯å®å ¨ã§ã)ãã¡ã³ã颿°ããããã®å®ç¾©ããã¦ããã¯ã©ã¹ (ã¾ãã¯å²ã£ã¦ããã¯ã©ã¹) ãè¿ããã¨ã許容ãã¾ãã
颿°å®ç¾©ã® declarator å ã§å®£è¨ããã弿°ã¯æ¬ä½ã®ã¹ã³ã¼ãã§å®ç¾©ããã¾ãã 弿°ã颿°ã®æ¬ä½ã§ä½¿ç¨ãããªãå ´åã¯ãååãä»ããå¿ è¦ã¯ããã¾ãã (æ½è±¡å®£è¨åã使ç¨ããã«ã¯ããã§ååã§ã)ã
void print(int a, int) // 第2弿°ã¯ä½¿ç¨ããã¾ããã { std::printf("a = %d\n",a); }
ãã¨ã弿°ã«å¯¾ãããããã¬ãã«ã® cv 修飾åã颿°å®£è¨ã§ã¯ç ´æ£ãããã¨ãã¦ãããããã¯é¢æ°ã®æ¬ä½ã§ã¯å¼æ°ã®åãå¯è¦ãªãã®ã¨ãã¦å¤æ´ãã¾ãã
void f(const int n) // void(int) åã®é¢æ°ã宣è¨ãã¾ãã { // ãããæ¬ä½ã§ã¯ã n ã®å㯠const int ã§ãã }
åé¤ããã颿°é¢æ°æ¬ä½ã®ä»£ããã«ç¹å¥ãªæ§æ 颿°ããªã¼ãã¼ãã¼ãããã¦ããå ´åã¯ãã¾ããªã¼ãã¼ãã¼ã解決ãè¡ãããããã¦åé¤ããã颿°ã鏿ãããå ´åã«ã®ã¿ãããã°ã©ã 㯠ill-formed ã§ãã struct sometype { void* operator new(std::size_t) = delete; void* operator new[](std::size_t) = delete; }; sometype* p = new sometype; // ã¨ã©ã¼ãåé¤ããã sometype::operator new ã // å¼ã³åºããã¨ãã¦ãã¾ãã 颿°ã®åé¤ãããå®ç¾©ã¯ç¿»è¨³åä½å ã®æåã®å®£è¨ã§ãªããã°ãªãã¾ããã 以åã«å®£è¨ããã颿°ãåé¤ããããã®ã¨ãã¦åå®ç¾©ãããã¨ã¯ã§ãã¾ããã struct sometype { sometype(); }; sometype::sometype() = delete; // ã¨ã©ã¼ãæåã®å®£è¨ã§åé¤ãããªããã°ãªãã¾ããã __func__颿°ã®æ¬ä½å ã§ã颿°ãã¼ã«ã«ãªå®ç¾©æ¸ã¿ã®å¤æ° __func__ ãã以ä¸ã®ããã«å®ç¾©ããã¦ãããã®ããã«å®ç¾©ããã¾ãã static const char __func__[] = "function-name"; ãã®å¤æ°ã¯ãããã¯ã¹ã³ã¼ãã¨éçè¨æ¶åæéãæã¡ã¾ãã struct S { S(): s(__func__) {} // OKãåæååãªã¹ãã¯é¢æ°æ¬ä½ã®ä¸é¨ã§ãã const char* s; }; void f(const char* s = __func__); // ã¨ã©ã¼ã弿°ãªã¹ãã¯å®£è¨åã®ä¸é¨ã§ãã |
(C++11以ä¸) |
[ç·¨é] ãã¼ã
ç´æ¥åæåã®æ§æãç¨ãã夿°ã®å®£è¨ã¨é¢æ°ã®å®£è¨ã®éã§ææ§ãªå ´åãã³ã³ãã¤ã©ã¯å¸¸ã«é¢æ°ã®å®£è¨ã鏿ãã¾ãã ç´æ¥åæåãåç §ãã¦ãã ããã
[ç·¨é] ä¾
This section is incomplete Reason: move/cleanup |
#include <iostream> #include <string> // åå空é (ãã¡ã¤ã«) ã¹ã³ã¼ãã§ã®å®£è¨ // (å®ç¾©ã¯å¾ã§æä¾ããã¾ã)ã int f1(); // ããã©ã«ã弿°ãæã¡ä½ãè¿ããªãåç´ãªé¢æ°ã void f0(const std::string& arg = "world") { std::cout << "Hello, " << arg << '\n'; } // f0 ã¸ã®ãã¤ã³ã¿ãè¿ã颿° (C++11 ã¹ã¿ã¤ã«)ã auto fp11() -> void(*)(const std::string&) { return f0; } // f0 ã¸ã®ãã¤ã³ã¿ãè¿ã颿° (C++03 ã¹ã¿ã¤ã«)ã void (*fp03())(const std::string&) { return f0; } int main() { f0(); fp11()("test"); fp03()("again"); int f2(std::string); // 颿°ã¹ã³ã¼ãã§ã®å®£è¨ã std::cout << f2("bad12") << '\n'; } // int ãè¿ãåç´ãªéã¡ã³ã颿°ã int f1() { return 42; } // ä¾å¤æå®ã¨é¢æ° try ãããã¯ãæã¤é¢æ°ã int f2(std::string str) noexcept try { return std::stoi(str); } catch(const std::exception& e) { std::cerr << "stoi() failed!\n"; return 0; }
åºå:
Hello, world Hello, test Hello, again stoi() failed! 0
[ç·¨é] æ¬ é¥å ±å
以ä¸ã®åä½å¤æ´æ¬ é¥å ±åã¯ä»¥åã«çºè¡ããã C++ æ¨æºã«é¡ã£ã¦é©ç¨ããã¾ããã
DR | é©ç¨å | çºè¡æã®åä½ | æ£ããåä½ |
---|---|---|---|
CWG 1394 | C++11 | deleted function could not return an incomplete type | incomplete return type allowed |
CWG 577 | C++11 | dependent type void could be used to declare a no-parameter function | only non-dependent void is allowed |
CWG 393 | C++14 | types that include pointers/references to array of unknown bound can't be parameters | such types are allowed |
[ç·¨é] é¢é£é ç®
颿°å®£è¨ ã® Cè¨èªãªãã¡ã¬ã³ã¹
|