pureとnothrowの判定


投稿ツリー



前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/9/8 19:03 | 最終変更
tama  一人前   投稿数: 111
http://d.hatena.ne.jp/pastel-magic/20090901/1251766511
これ見てて何でpureだと無理なのかなぁと.記事のは「nothrowな関数からnothrow修飾されてない関数を呼べない」というのを利用してると思ってるんですが,それはpureでも同じような?
#code(d){{{
void f1() {}
void f2() nothrow { f1(); } // Error: function foo.f2 'f2' is nothrow yet may throw

void g1() {}
void g2() pure { g1(); } // Error: pure function 'g2' cannot call impure function 'g1'
}}}
何か勘違いしている??
投票数:105 平均点:3.24
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2009/9/9 2:08
SHOO  管理人   投稿数: 658
バグっぽい気がしますね。

#code(d){{{
import std.traits : ParameterTypeTuple;

template isNothrowFunction(alias fun)
{
enum isNothrowFunction = is(typeof(
{
void test() nothrow
{
ParameterTypeTuple!fun args;
fun(args);
}
}()));
}

template isPureFunction(alias fun)
{
enum isPureFunction = is(typeof(
{
static void test() pure
{
ParameterTypeTuple!fun args;
fun(args);
}
}()));
}


void fn(){}
void fnNothorw() nothrow {}
void fnPure() pure {}

static assert(isNothrowFunction!fn == false);
static assert(isNothrowFunction!fnNothorw == true);
static assert(isPureFunction!fn == false);// Error: static assert (1 == 0) is false
static assert(isPureFunction!fnPure == true);
}}}
こうあるべきなのに、うまくいかない…ということでしょうか。

それと、その過程で変な事を発見しましたが…
#code(d){{{
void test() nothrow
}}}
この個所を、
#code(d){{{
nothrow void test()
}}}
こうするとうまく動作しなくなります。
謎です。(というかたぶんバグ)
投票数:125 平均点:4.64
返信する
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2009/9/12 17:51
tama  一人前   投稿数: 111
書く位置によって効果が変わるのであればバグっぽいですねぇ.スレでもmixinの場所によって効果が違っている例もありましたし,この辺はクリティカルなバグでもないので修正待ちですかね.
投票数:96 平均点:3.85
返信する

このトピックに投稿する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu