2013-05-06 1 views
0

У меня возникают проблемы с вложенными блоками let в Boost Phoenix, когда «внутренняя» локальная переменная скрывает «внешнюю» локальную переменную. Даже на примере «Видимость» из документации here, как показано здесь:Переменная скрыта в блоках вложенных блоков в Boost Phoenix

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

namespace phoenix = boost::phoenix; 
using namespace phoenix::local_names; 

int main(int argc, char *argv[]) 
{ 
    phoenix::let(_x = 1, _y = ", World") 
    [ 
    phoenix::let(_x = "Hello") // hides the outer _x 
    [ 
     std::cout << _x << _y // prints "Hello, World" 
    ] 
    ](); 

    return 0; 
} 

Я получаю ошибки, начиная с:

GCC: "error: function returning an array" 
Clang: "error: function cannot return array type 'result_type' (aka 'char [6]')" 

Кто-нибудь знает, как я могу «теневой» такой переменной в пределах объема внутреннего блока let в Фениксе? В настоящее время я использую Ubuntu 13.04 с моментальным снимком версии 4.8 GCC; Clang 3.2; Boost 1.49; а также Boost 1.53.

ответ

2

Это определенно ошибка в Фениксе. Следующий компилирует:

int y = 0; 
int x = (phoenix::let(_a = 1, _b = 2)[phoenix::let(_b = _1)[ _a ]])(y); 

нижеперечисленные не:

int y = 0; 
int x = (phoenix::let(_a = 1, _b = 2)[phoenix::let(_b = 3)[ _a ]])(y); 

Bizarre. Не удалось найти ошибку в https://svn.boost.org/trac/boost/ (нажмите «Новый билет»). Благодарю. (Примечание: я не являюсь сопровождающим.)

+0

Несомненно. Спасибо за ввод. – user2023370

+0

Ошибка теперь подана [здесь] (https://svn.boost.org/trac/boost/ticket/8564) – user2023370