c++ 自定义删除器unique_ptr在对象代码中创建“未使用函数”警告,并在链接期间创建错误

btxsgosb  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(112)

我正在为我的大程序创建一个目标文件,在这个程序中我使用了一个定义了自定义删除器的unique_ptr类型,所以我这样编译我的文件:

g++ -std=c++20 tmp.cpp -c -Wall

代码如下所示:

#include <memory>

using specialptr = std::unique_ptr<int, decltype([](int *f) {
                     delete f;
                   })>;

specialptr fun(){ 
  return specialptr{new int};
}

这将生成以下警告:

tmp.cpp:12:12: warning: ‘specialptr fun()’ defined but not used [-Wunused-function]
   12 | specialptr fun(){ return specialptr{new int};}
      |

当我将此目标文件与调用该函数的main.cpp链接时,我得到以下错误:

In file included from main.cpp:1:
tmp.h:19:12: warning: ‘specialptr fun()’ used but never defined
   19 | specialptr fun();
      |            ^~~
/usr/bin/ld: /tmp/ccnuTTGC.o: in function `main':
main.cpp:(.text+0x4c): undefined reference to `fun()'
collect2: error: ld returned 1 exit status

这是怎么回事?当我把返回值从unique_ptr改为普通指针时,我的代码可以正常工作。但凭直觉,我定义了类型和函数,并在头文件中进行了声明。
g是版本:g(Ubuntu 11.3.0- 12.04版本)11.3.0

shyt4zoc

shyt4zoc1#

你可以使用对象类型作为删除器,在这种情况下,你不需要每次创建std::unique_ptr时都设置它。

#include <memory>
#include <iostream>

struct MyDeleter {
    void operator()(int *f) {
        std::cout << "Deleter called";
        delete f;
    }
};

using specialptr = std::unique_ptr<int, MyDeleter>;

specialptr fun(){ 
  return specialptr{new int};
}

int main()
{
    auto x = fun();
}
cnjp1d6j

cnjp1d6j2#

lambda的decltype对于每个翻译单元是不同的。
您可以改为执行以下操作:

struct specialptr_deleter {
  void operator()(int *f) const {
    delete f;
  }
};

using specialptr = std::unique_ptr<int, specialptr_deleter>;

specialptr fun(){ 
  return specialptr{new int};
}

相关问题