指针getter到参考

时间:2017-04-01 14:16:18

标签: c++ class pointers reference getter

我有一个带引用的类,并且需要一个返回指针的getter。

class X {
    std::string& text;
public:
    auto GetText() -> decltype(text) * { return &text); // doesn't work
    X(std::string& text): text(text) {}
};

简单的方法是将指针传递给此类。但是如果我传递一个引用,我可以得到一个带有getter的指针吗?

修改:这是错误消息

error: cannot declare pointer to 'std::__cxx11::string& {aka class std::__cxx11::basic_string<char>&}'
auto GetText() -> decltype(text) * { return &text);
                                 ^

2 个答案:

答案 0 :(得分:1)

首先,

auto GetText() -> decltype(text) * { return &text); // doesn't work

是宣布此签名的正面可恶方式。喜欢

std::string* GetText(){ return &text);

甚至只是

auto GetText(){ return &text);

但这不是代码审查。

这里的问题是你要求指向text成员变量的声明类型的指针,该变量是一个字符串引用(std::string&)。在评论部分,您似乎没有意识到decltype尊重其引用&#39; ness,&#39; const&#39; ners,以及&#39; volatile&#39; ness of its参数。

你不能在C ++中有一个指向引用的指针,例如std::string&*格式不正确。致电std::remove_reference_t应解决该问题,例如

auto GetText() -> std::remove_reference_t<decltype(text)> * { return &text);

但是,在这种情况下,auto无论如何都会正确推断出您的类型,因此您的显式声明是不必要的。

答案 1 :(得分:0)

我为我最初的问题做了test program。该程序有一个带有指针的类和一个返回引用的getter,带有引用的第二个类和一个返回指针的getter。

似乎-> std::remove_reference_t<decltype(text)>可以替换为-> decltype(&text)

随意发表评论。

// g++ main.cpp -o test_reference_pointer && strip -s test_reference_pointer && ./test_reference_pointer

#include <iostream>

// A class with a pointer and a getter that returns a reference.
class A {
    std::string *text;
public:
    std::string& GetText_old_way() { return *text; }
    auto GetText_pure_auto() { return *text; }
    auto GetText_pointer_arithmetic() -> decltype(*text) & { return *text; }
public:
    A(std::string *text): text(text) {}
};

// A class with a reference and a getter that returns a pointer.
class B {
    std::string& text;
public:
    std::string *GetText_old_way() { return &text; }
    auto GetText_pure_auto() { return &text; }
    auto GetText_pointer_arithmetic() -> decltype(&text) { return &text; }
    auto GetText_remove_reference() -> std::remove_reference_t<decltype(text)> * { return &text; }
public:
    B(std::string& text): text(text) {}
};

int main() {
    std::string text = "hello, world";

    {//TEST
        A a(&text);
        unsigned int i{0};

        std::cout << "-- Test 1:"<< std::endl;
        ++i; std::cout << i << ". " << a.GetText_old_way() << std::endl;
        ++i; std::cout << i << ". " << a.GetText_pointer_arithmetic() << std::endl;
        ++i; std::cout << i << ". " << a.GetText_pure_auto() << std::endl;
        std::cout << std::endl;
    }

    {//TEST
        B b(text);
        unsigned int i{0};

        std::cout << "-- Test 2:"<< std::endl;
        ++i; std::cout << i << ". " << *b.GetText_old_way() << std::endl;
        ++i; std::cout << i << ". " << *b.GetText_pointer_arithmetic() << std::endl;
        ++i; std::cout << i << ". " << *b.GetText_remove_reference() << std::endl;
        ++i; std::cout << i << ". " << *b.GetText_pure_auto() << std::endl;
        std::cout << std::endl;
    }

    return 0;
}