<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_4_subsect_6_thread_31785"  />
<title>rulinux.net - Форум - Development - C++, зогатка.</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Форум - Development - C++, зогатка.</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Re: C++, зогатка.</title>
<link>https://rulinux.net/message.php?newsid=31785&amp;page=1#76638</link>
<guid>https://rulinux.net/message.php?newsid=31785&amp;page=1#76638</guid>
<pubDate>Sat, 08 Jan 2011 08:15:48 +0300</pubDate>
<description><![CDATA[<p>ты страничку с разметкой читал? не begin[c] а begin[cpp]{highlight}</p>]]></description>
</item>
<item>
<title>Re: C++, зогатка.</title>
<link>https://rulinux.net/message.php?newsid=31785&amp;page=1#76637</link>
<guid>https://rulinux.net/message.php?newsid=31785&amp;page=1#76637</guid>
<pubDate>Sat, 08 Jan 2011 08:02:12 +0300</pubDate>
<description><![CDATA[<p>нмхренашегьки не работает у вас дижок форума</p>]]></description>
</item>
<item>
<title>C++, зогатка.</title>
<link>https://rulinux.net/message.php?newsid=31785&amp;page=1#76636</link>
<guid>https://rulinux.net/message.php?newsid=31785&amp;page=1#76636</guid>
<pubDate>Sat, 08 Jan 2011 08:01:00 +0300</pubDate>
<description><![CDATA[<p><fieldset><legend>cpp</legend><code><br />
<span style="color: #339900;">#include </span><br />
<span style="color: #0000ff;">typedef</span> <span style="color: #0000ff;">int</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>f_ptr<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> x, <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> y<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
<span style="color: #666666;">// error: uninitialized const member `::f'</span><br />
<span style="color: #666666;">//struct {</span><br />
<span style="color: #666666;">// &nbsp; &nbsp;const char * s;</span><br />
<span style="color: #666666;">// &nbsp; &nbsp;const f_ptr f;</span><br />
<span style="color: #666666;">//} test00 = { }; </span><br />
<span style="color: #0000ff;">struct</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> s<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; f_ptr f<span style="color: #008080;">;</span> <span style="color: #666666;">// non-const, OK too.</span><br />
<span style="color: #008000;">&#125;</span> test0 <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span> <br />
<span style="color: #0000ff;">struct</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> s<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> f_ptr f<span style="color: #008080;">;</span><br />
<span style="color: #008000;">&#125;</span> test1 <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #FF0000;">&quot;lol&quot;</span>, <span style="color: #0000ff;">NULL</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// OK</span><br />
<span style="color: #0000ff;">struct</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> s<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> f_ptr <span style="color: #000040;">*</span> f<span style="color: #008080;">;</span> <span style="color: #666666;">// double ptr apparently.</span><br />
<span style="color: #008000;">&#125;</span> test2 <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// OK</span><br />
<span style="color: #0000ff;">struct</span> <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> <span style="color: #000040;">*</span> s<span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">const</span> f_ptr <span style="color: #000040;">**</span> f<span style="color: #008080;">;</span> <span style="color: #666666;">// triple ptr?</span><br />
<span style="color: #008000;">&#125;</span> test3 <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span> <span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// OK</span><br />
<br />
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">int</span> x <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span><br />
<span style="color: #666666;">// &nbsp; &nbsp;x += (&amp;(test0.f))(0, 0); // error: `(((int (**)(int, int))(&amp;test0)) + 4u)' cannot be used as a function</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> test0.<span style="color: #007788;">f</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>test0.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">**</span><span style="color: #008000;">&#40;</span>test0.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">***</span><span style="color: #008000;">&#40;</span>test0.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
<br />
<span style="color: #666666;">// &nbsp; &nbsp;x += (&amp;(test1.f))(0, 0); // error: `(((int (* const*)(int, int))(&amp;test1)) + 4u)' cannot be used as a function</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> test1.<span style="color: #007788;">f</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>test1.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">**</span><span style="color: #008000;">&#40;</span>test1.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">***</span><span style="color: #008000;">&#40;</span>test1.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
<span style="color: #666666;">// &nbsp; &nbsp;x += (&amp;(test2.f))(0, 0); // error: `(((int (* const**)(int, int))(&amp;test2)) + 4u)' cannot be used as a function</span><br />
<span style="color: #666666;">// &nbsp; &nbsp;x += test2.f(0, 0); // error: `test2.::f' cannot be used as a function</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>test2.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">**</span><span style="color: #008000;">&#40;</span>test2.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">***</span><span style="color: #008000;">&#40;</span>test2.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
<span style="color: #666666;">// &nbsp; &nbsp;x += (&amp;(test3.f))(0, 0); // error: `(((int (* const***)(int, int))(&amp;test3)) + 4u)' cannot be used as a function</span><br />
<span style="color: #666666;">// &nbsp; &nbsp;x += test3.f(0, 0); // error: test3.::f' cannot be used as a function</span><br />
<span style="color: #666666;">// &nbsp; &nbsp;x += (*(test3.f))(0, 0); // &nbsp;`*test3.::f' cannot be used as a function</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">**</span><span style="color: #008000;">&#40;</span>test3.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; x <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">***</span><span style="color: #008000;">&#40;</span>test3.<span style="color: #007788;">f</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>0, 0<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">return</span> x<span style="color: #008080;">;</span><br />
<span style="color: #008000;">&#125;</span><br />
&nbsp;</code></fieldset> Суть зогатки: меня не очень удивляет, что указатели на функции можно бесконечно дереференсить и они по-прежнему остаются как бы функциями.</p><p>Но меня дико удивляет, почему простой указатель на функцию отказывается дефолт-инициализироваться (если я правильно понимаю, гарантированно в NULL). Причём только если он ещё и const.</p><p>Проверял в gcc 3.4.6, 4.2.2. </p>]]></description>
</item>
</channel>
</rss>