2012-12-28 10 views
5

Ich experimentiere mit Proto und Phönix und was ist eines meiner ersten Spielzeug Beispiele Crash und ich habe keine Ahnung wo ich hinschauen sollte. Da jemand auf dem IRC-Kanal #boost mich aufgefordert hat, sicherzustellen, dass der Phoenix-Ausdrucksbaum zuerst tief kopiert wird (so dass keine freien Referenzen übrig sind, wenn x konstruiert wurde), habe ich den Ausdruck um boost::proto::deep_copy gekapselt. Jedoch that didn't quite work. Es stürzt immer noch ab, wenn es mit dem -O2 Flag und works fine when omitting it kompiliert wird.Warum stürzt dieses Prototyp-Spielzeug ab?

#include <boost/phoenix/phoenix.hpp> 
#include <boost/proto/deep_copy.hpp> 
#include <iostream> 

namespace bpr = boost::proto; 

int main(int argc, char **argv) { 
    using namespace boost::phoenix; 
    using namespace placeholders; 

    auto x = bpr::deep_copy(
    switch_(arg1)[ 
     case_<1>(std::cout << val("hello")), 
     case_<2>(std::cout << val("bye")), 
     default_(std::cout << val("default")) 
    ]); 

    x(1); 
    x(2); 
} 

Ich erwarte, dass dies zur Ausgabe hellobye.

+0

@llonesmiz siehe http://liveworkspace.org/code/3Rdg5D$0. Es gibt keine Ausgabe. –

+0

Seitdem hat Liveworkspace Update Boost auf Version 1.53, jetzt funktioniert Ihr Code wie erwartet. Ich glaube, das Problem wurde in 1.52 gelöst. –

Antwort

2

Sieht aus wie dies ist ein bekannter bug in Phoenix. Ich würde vermeiden, phoenix::switch_ zu verwenden, bis dies sortiert ist. Leider scheint der Betreuer von Phoenix in diesen Tagen mit anderen Dingen beschäftigt zu sein. :-(