簡體   English   中英

重載指針的右值/常量左值

[英]Overloading rvalue/const lvalue for pointer

我正在使用gcc 4.8.4。

以下代碼由於第22行(​​指示)的編譯器錯誤而失敗:

從類型'int * const'的表達式對類型'int * &&'的引用的無效初始化

為什么不使用square的左值版本對square(ptr)進行調用?

#include <iostream>
#include <memory>

int square(int* &&num) {
    std::cout << "rvalue" << std::endl;
    std::unique_ptr<int> x(num);
    const auto ptr = x.get();
    return square(ptr);  // this is line 22
}

int square(const int* &num) {
    std::cout << "lvalue" << std::endl;
    return (*num) * (*num);
}

int main() {
    std::unique_ptr<int> up(new int);
    *up = 5;
    std::cout << square(up.release()) << std::endl;
}

您有訂單問題:

return square(ptr);

僅查看int square(int* &&num)聲明,並且無效

並且int square(const int* &num)應該是int square(int*const &num)

固定版

在第22行,作用域中square()的唯一定義是采用右值引用的int square(int* &&) ptr是一個左值,因此錯誤消息說明了類型的差異。

如果交換函數定義的順序,使int square(const int* &)也位於范圍內,則仍然會出現相同的錯誤。 那是因為您有一個指向可變int的指針,所以lvalue函數仍然不是候選項。

您可以更改它以接受對指向int的指針的const引用:

int square(int *const& num) {
    std::cout << "lvalue" << std::endl;
    return (*num) * (*num);
}

現在,該程序可以編譯並運行。

顯然,這可以簡化為按值接受num ,但是我猜想您要使用比int更重的東西來進行此工作。

改寫的例子

#include <iostream>
#include <memory>

int square(int *const& num) {
    std::cout << "lvalue" << std::endl;
    return *num * *num;
}

int square(int*&& num) {
    std::cout << "rvalue" << std::endl;
    std::unique_ptr<int> x(num);
    const auto ptr = x.get();
    return square(ptr);
}

int main() {
    auto up = std::make_unique<int>(5);
    std::cout << square(up.release()) << std::endl;
}

附帶說明一下,我嘗試避免unique_ptr::release() -與帶有裸指針所有權的C ++ 11以前的代碼接口時很有用,但是如果不詳細關注代碼,很難推理。 現代代碼應該更喜歡傳遞智能指針:

int square(std::unique_ptr<int>&& x) {
    std::cout << "rvalue" << std::endl;
    const auto ptr = x.get();
    return square(ptr);
}

int main() {
    auto up = std::make_unique<int>(5);
    std::cout << square(std::move(up)) << std::endl;
}

在這里,更加清楚的是square()將獲得其參數的所有權。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM