68
68
69
69
</ head >
70
70
< body >
71
- < header data-kunai-mdinfo ="{"meta": {"cpp": ["cpp11"]}, "sources": [{"id": "2cc2a21cc14e16a5926d30998ffb7bc5955a0c02", "source": "#include <iostream>\n\ntemplate<typename T, typename U>\nauto add(const T& lhs, const U& rhs)\n -> decltype(lhs + rhs) // add \u306e\u623b\u308a\u5024\u578b\u306f lhs + rhs \u306e\u5f0f\u306e\u578b\n{\n return lhs + rhs;\n}\n\nint main()\n{\n auto r = add(1, 2.0F); // r \u306e\u578b\u306f float \u578b\n std::cout << std::fixed << r << '\\n';\n}\n"}, {"id": "2245d6f58402d79348ba8a235266a8a05cca4e0a", "source": "#include <iostream>\n\nint main()\n{\n int i = 10;\n decltype(i) j = i; // j \u306f int \u578b\n decltype((i)) k = i; // k \u306f int& \u578b\uff08i \u306f lvalue \u3067\u4e38\u62ec\u5f27\u304c\u4ed8\u3044\u3066\u3044\u308b\u306e\u3067\uff09\n\n i = 42;\n std::cout << j << \", \" << k << '\\n';\n}\n"}, {"id": "6d9d26de98bd709edc985a6c40bf455c07e9c4fb", "source": "#include <iostream>\n\nstruct S {\n int i = 42;\n};\n\nint main()\n{\n S s;\n auto mp = &decltype(s)::i; // mp \u306e\u578b\u306f int S::* \u578b\uff08S \u306e int \u578b\u306e\u30e1\u30f3\u30d0\u3078\u306e\u30dd\u30a4\u30f3\u30bf\uff09\n std::cout << s.*mp << '\\n';\n}\n"}, {"id": "b71c456e74c82059f18942232a989de1d9286a47", "source": "#include <iostream>\n\nstruct S {\n S() { std::cout << \"S()\\n\"; }\n ~S() { std::cout << \"~S()\\n\"; }\n};\n\nS f();\n\nint main()\n{\n std::cout << \"allocate\\n\";\n void* p = ::operator new(sizeof(f()));\n\n std::cout << \"construct\\n\";\n ::new(p) decltype(f()); // \u914d\u7f6e new \u3067 p \u306e\u6307\u3059\u30e1\u30e2\u30ea\u306b S \u578b\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u69cb\u7bc9\n\n std::cout << \"destruct\\n\";\n auto sp = static_cast<decltype(f())*>(p); // \u30c7\u30b9\u30c8\u30e9\u30af\u30bf\u547c\u3073\u51fa\u3057\u306e\u305f\u3081\u3001S \u578b\u3078\u306e\u30dd\u30a4\u30f3\u30bf\u306b\u30ad\u30e3\u30b9\u30c8\n sp->~decltype(f())(); // \u660e\u793a\u7684\u30c7\u30b9\u30c8\u30e9\u30af\u30bf\u547c\u3073\u51fa\u3057\u3067 sp \u306e\u6307\u3059\u30e1\u30e2\u30ea\u306e S \u578b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u7834\u68c4\n\n std::cout << \"deallocate\\n\";\n ::operator delete(p);\n}\n"}, {"id": "81c563fd16e7646be5cbcf026bd4841e8b2e13e5", "source": "#include <iostream>\n\nstruct S {\n int i;\n S(int i) : i(i) {}\n operator decltype(i)() { return i; } // int \u578b\u3078\u306e\u5909\u63db\u6f14\u7b97\u5b50\n};\n\nint main()\n{\n S s(42);\n std::cout << s << '\\n';\n}\n"}, {"id": "58f87463b824488b544049b01469532b5c1751f2", "source": "#include <iostream>\n#include <utility>\n\ntemplate<typename T>\nauto d(T&& x)\n{\n return x + x;\n}\n\nstruct S {\n static constexpr int g = 20;\n};\n\nconstexpr int S::g;\n\nint main()\n{\n auto l = [](auto&& x) {\n std::cout << \"start\\n\";\n auto ret = d(std::forward<decltype(x)>(x)); // x \u306e\u578b\u306e\u307e\u307e\u3067\u8ee2\u9001\n std::cout << \"end\\n\";\n return ret;\n };\n std::cout << l(S::g) << '\\n';\n}\n"}], "page_id": ["lang", "cpp11", "decltype"]} ">
71
+ < header data-kunai-mdinfo ="{"meta": {"cpp": ["cpp11"]}, "sources": [{"id": "2cc2a21cc14e16a5926d30998ffb7bc5955a0c02", "source": "#include <iostream>\n\ntemplate<typename T, typename U>\nauto add(const T& lhs, const U& rhs)\n -> decltype(lhs + rhs) // add \u306e\u623b\u308a\u5024\u578b\u306f lhs + rhs \u306e\u5f0f\u306e\u578b\n{\n return lhs + rhs;\n}\n\nint main()\n{\n auto r = add(1, 2.0F); // r \u306e\u578b\u306f float \u578b\n std::cout << std::fixed << r << '\\n';\n}\n"}, {"id": "10abf31123e76640d0003465b70235ee2a6a22e5", "source": "#include <iostream>\n\nint main()\n{\n int i = 10;\n decltype(i) j = i; // j \u306f int \u578b\n decltype((i)) k = i; // k \u306f int& \u578b\uff08i \u306f lvalue \u3067\u4e38\u30ab\u30c3\u30b3\u304c\u4ed8\u3044\u3066\u3044\u308b\u306e\u3067\uff09\n\n i = 42;\n std::cout << j << \", \" << k << '\\n';\n}\n"}, {"id": "6d9d26de98bd709edc985a6c40bf455c07e9c4fb", "source": "#include <iostream>\n\nstruct S {\n int i = 42;\n};\n\nint main()\n{\n S s;\n auto mp = &decltype(s)::i; // mp \u306e\u578b\u306f int S::* \u578b\uff08S \u306e int \u578b\u306e\u30e1\u30f3\u30d0\u3078\u306e\u30dd\u30a4\u30f3\u30bf\uff09\n std::cout << s.*mp << '\\n';\n}\n"}, {"id": "b71c456e74c82059f18942232a989de1d9286a47", "source": "#include <iostream>\n\nstruct S {\n S() { std::cout << \"S()\\n\"; }\n ~S() { std::cout << \"~S()\\n\"; }\n};\n\nS f();\n\nint main()\n{\n std::cout << \"allocate\\n\";\n void* p = ::operator new(sizeof(f()));\n\n std::cout << \"construct\\n\";\n ::new(p) decltype(f()); // \u914d\u7f6e new \u3067 p \u306e\u6307\u3059\u30e1\u30e2\u30ea\u306b S \u578b\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u69cb\u7bc9\n\n std::cout << \"destruct\\n\";\n auto sp = static_cast<decltype(f())*>(p); // \u30c7\u30b9\u30c8\u30e9\u30af\u30bf\u547c\u3073\u51fa\u3057\u306e\u305f\u3081\u3001S \u578b\u3078\u306e\u30dd\u30a4\u30f3\u30bf\u306b\u30ad\u30e3\u30b9\u30c8\n sp->~decltype(f())(); // \u660e\u793a\u7684\u30c7\u30b9\u30c8\u30e9\u30af\u30bf\u547c\u3073\u51fa\u3057\u3067 sp \u306e\u6307\u3059\u30e1\u30e2\u30ea\u306e S \u578b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u7834\u68c4\n\n std::cout << \"deallocate\\n\";\n ::operator delete(p);\n}\n"}, {"id": "81c563fd16e7646be5cbcf026bd4841e8b2e13e5", "source": "#include <iostream>\n\nstruct S {\n int i;\n S(int i) : i(i) {}\n operator decltype(i)() { return i; } // int \u578b\u3078\u306e\u5909\u63db\u6f14\u7b97\u5b50\n};\n\nint main()\n{\n S s(42);\n std::cout << s << '\\n';\n}\n"}, {"id": "58f87463b824488b544049b01469532b5c1751f2", "source": "#include <iostream>\n#include <utility>\n\ntemplate<typename T>\nauto d(T&& x)\n{\n return x + x;\n}\n\nstruct S {\n static constexpr int g = 20;\n};\n\nconstexpr int S::g;\n\nint main()\n{\n auto l = [](auto&& x) {\n std::cout << \"start\\n\";\n auto ret = d(std::forward<decltype(x)>(x)); // x \u306e\u578b\u306e\u307e\u307e\u3067\u8ee2\u9001\n std::cout << \"end\\n\";\n return ret;\n };\n std::cout << l(S::g) << '\\n';\n}\n"}], "page_id": ["lang", "cpp11", "decltype"]} ">
72
72
< nav class ="navbar navbar-default " role ="navigation ">
73
73
< div class ="container-fluid ">
74
74
< div class ="navbar-header ">
188
188
189
189
< p class ="text-right "> < small >
190
190
最終更新日時(UTC):
191
- < span itemprop ="datePublished " content ="2024-07-10T07:47:57 ">
192
- 2024年07月10日 07時47分57秒
191
+ < span itemprop ="datePublished " content ="2024-07-18T16:39:47 ">
192
+ 2024年07月18日 16時39分47秒
193
193
</ span >
194
194
< br />
195
195
< span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
@@ -223,7 +223,7 @@ <h2>概要</h2>
223
223
< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="kt "> int</ span > < span class ="n "> i</ span > < span class ="o "> =</ span > < span class ="mi "> 0</ span > < span class ="p "> ;</ span >
224
224
< span class ="n "> < span style ="color:#ff0000 "> decltype</ span > </ span > < span class ="p "> (</ span > < span class ="n "> i</ span > < span class ="p "> )</ span > < span class ="n "> j</ span > < span class ="o "> =</ span > < span class ="mi "> 0</ span > < span class ="p "> ;</ span > < span class ="c1 "> // j は int 型</ span >
225
225
< span class ="n "> < span style ="color:#ff0000 "> decltype</ span > </ span > < span class ="p "> (</ span > < span class ="n "> i</ span > < span class ="p "> )</ span > < span class ="o "> *</ span > < span class ="n "> p</ span > < span class ="o "> =</ span > < span class ="o "> &</ span > < span class ="n "> i</ span > < span class ="p "> ;</ span > < span class ="c1 "> // p は int* 型</ span >
226
- < span class ="n "> < span style ="color:#ff0000 "> decltype</ span > </ span > < span class ="p "> ((</ span > < span class ="n "> i</ span > < span class ="p "> ))</ span > < span class ="n "> k</ span > < span class ="o "> =</ span > < span class ="n "> i</ span > < span class ="p "> ;</ span > < span class ="c1 "> // k は int& 型(変数名 i の周りの余分な丸括弧に注意 )</ span >
226
+ < span class ="n "> < span style ="color:#ff0000 "> decltype</ span > </ span > < span class ="p "> ((</ span > < span class ="n "> i</ span > < span class ="p "> ))</ span > < span class ="n "> k</ span > < span class ="o "> =</ span > < span class ="n "> i</ span > < span class ="p "> ;</ span > < span class ="c1 "> // k は int& 型(変数名 i の周りの余分な丸カッコに注意 )</ span >
227
227
228
228
< span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> typename</ span > < span class ="n "> T</ span > < span class ="p "> ,</ span > < span class ="k "> typename</ span > < span class ="n "> U</ span > < span class ="o "> ></ span >
229
229
< span class ="k "> auto</ span > < span class ="n "> add</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="n "> T</ span > < span class ="o "> &</ span > < span class ="n "> lhs</ span > < span class ="p "> ,</ span > < span class ="k "> const</ span > < span class ="n "> U</ span > < span class ="o "> &</ span > < span class ="n "> rhs</ span > < span class ="p "> )</ span >
@@ -240,15 +240,15 @@ <h2>概要</h2>
240
240
< h2 > 仕様</ h2 >
241
241
< p > < code > e</ code > を式とすると、< code > decltype(e)</ code > が意味する型は以下のとおりである。</ p >
242
242
< ul >
243
- < li > < code > e</ code > が丸括弧で囲まれていない識別子の場合 、あるいは、丸括弧で囲まれていないクラスメンバアクセスの場合 、< code > decltype(e)</ code > は < code > e</ code > で指定された実体の型である。< br />
243
+ < li > < code > e</ code > が丸カッコで囲まれていない識別子の場合 、あるいは、丸カッコで囲まれていないクラスメンバアクセスの場合 、< code > decltype(e)</ code > は < code > e</ code > で指定された実体の型である。< br />
244
244
もしそのような実体が無いか、あるいは、< code > e</ code > がオーバーロードされた複数の関数を指す場合、プログラムは< a class ="cpprefjp-defined-word " data-desc ="プログラムが適格でないこと。コンパイルエラーなどになる " href ="../../implementation-compliance.html#dfn-ill-formed "> 不適格</ a > である。</ li >
245
245
< li > そうではなくて、もし < code > e</ code > が xvalue の場合、< code > e</ code > の型を < code > T</ code > とすると、< code > decltype(e)</ code > は < code > T&&</ code > である。</ li >
246
246
< li > そうではなくて、もし < code > e</ code > が lvalue の場合、< code > e</ code > の型を < code > T</ code > とすると、< code > decltype(e)</ code > は < code > T&</ code > である。</ li >
247
247
< li > 上記以外の場合、< code > decltype(e)</ code > は < code > e</ code > の型である。</ li >
248
248
</ ul >
249
249
< p > < code > decltype</ code > のオペランドは「評価されないオペランド」である。</ p >
250
- < p > ラムダ式の関数本体で、外部の自動変数に対して < code > decltype</ code > を余分な丸括弧付きで使用した場合 、クロージャ型のメンバ変数に対する < code > decltype</ code > とみなされる。</ p >
251
- < p > < code > sizeof</ code > とは異なり、< code > decltype</ code > のオペランドには丸括弧が必須である 。(< code > sizeof i</ code > はOKだが、< code > decltype i</ code > はNG)</ p >
250
+ < p > ラムダ式の関数本体で、外部の自動変数に対して < code > decltype</ code > を余分な丸カッコ付きで使用した場合 、クロージャ型のメンバ変数に対する < code > decltype</ code > とみなされる。</ p >
251
+ < p > < code > sizeof</ code > とは異なり、< code > decltype</ code > のオペランドには丸カッコが必須である 。(< code > sizeof i</ code > はOKだが、< code > decltype i</ code > はNG)</ p >
252
252
< h2 > 例</ h2 >
253
253
< h3 > 関数の戻り型での使用例</ h3 >
254
254
< p > < div class ="yata " id ="2cc2a21cc14e16a5926d30998ffb7bc5955a0c02 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../reference/iostream.html "> <iostream></ a > </ span > < span class ="cp "> </ span >
@@ -271,13 +271,13 @@ <h4>出力</h4>
271
271
< p > < pre > < code > 3.000000
272
272
</ code > </ pre > </ p >
273
273
< h3 > 変数の型としての使用例</ h3 >
274
- < p > < div class ="yata " id ="2245d6f58402d79348ba8a235266a8a05cca4e0a "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../reference/iostream.html "> <iostream></ a > </ span > < span class ="cp "> </ span >
274
+ < p > < div class ="yata " id ="10abf31123e76640d0003465b70235ee2a6a22e5 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../reference/iostream.html "> <iostream></ a > </ span > < span class ="cp "> </ span >
275
275
276
276
< span class ="kt "> int</ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span >
277
277
< span class ="p "> {</ span >
278
278
< span class ="kt "> int</ span > < span class ="n "> i</ span > < span class ="o "> =</ span > < span class ="mi "> 10</ span > < span class ="p "> ;</ span >
279
279
< span class ="n "> < span style ="color:#ff0000 "> decltype</ span > </ span > < span class ="p "> (</ span > < span class ="n "> i</ span > < span class ="p "> )</ span > < span class ="n "> j</ span > < span class ="o "> =</ span > < span class ="n "> i</ span > < span class ="p "> ;</ span > < span class ="c1 "> // j は int 型</ span >
280
- < span class ="n "> < span style ="color:#ff0000 "> decltype</ span > </ span > < span class ="p "> ((</ span > < span class ="n "> i</ span > < span class ="p "> ))</ span > < span class ="n "> k</ span > < span class ="o "> =</ span > < span class ="n "> i</ span > < span class ="p "> ;</ span > < span class ="c1 "> // k は int& 型(i は lvalue で丸括弧が付いているので )</ span >
280
+ < span class ="n "> < span style ="color:#ff0000 "> decltype</ span > </ span > < span class ="p "> ((</ span > < span class ="n "> i</ span > < span class ="p "> ))</ span > < span class ="n "> k</ span > < span class ="o "> =</ span > < span class ="n "> i</ span > < span class ="p "> ;</ span > < span class ="c1 "> // k は int& 型(i は lvalue で丸カッコが付いているので )</ span >
281
281
282
282
< span class ="n "> i</ span > < span class ="o "> =</ span > < span class ="mi "> 42</ span > < span class ="p "> ;</ span >
283
283
< span class ="n "> < a href ="../../reference/iostream/cout.html "> std::cout</ a > </ span > < span class ="o "> <<</ span > < span class ="n "> j</ span > < span class ="o "> <<</ span > < span class ="s "> ", "</ span > < span class ="o "> <<</ span > < span class ="n "> k</ span > < span class ="o "> <<</ span > < span class ="sc "> '\n'</ span > < span class ="p "> ;</ span >
0 commit comments