可以安全地从具有C风格链接的函数返回类模板吗?

Pra*_*tic 5 c++ templates linkage

如果调用者和函数都同意类的内存布局(即相同的编译器和设置),那么具有C风格链接的函数返回从类模板实例化的类是否安全?

例:

#include <vector>
#include <iostream>

extern "C" std::vector<int> foo()
{
    return {{1, 2, 3}};
}

int main()
{
    const auto v = foo();
    for (const auto& i : v)
        std::cout << i << " ";
    std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

该程序使用g ++ 4.9.2和clang 3.5进行编译和运行.g ++没有发出警告,但clang发出以下内容:

test.cpp:4:29:警告:'foo'指定了C-linkage,但返回了不完整类型'std :: vector',它可能与C [-Wreturn-type-c-linkage]不兼容

这个错误对我来说没有意义,因为std::vector<int>它不是一个不完整的类型.这段代码创建了一个完整类型的std::vector<int>演示实例std::vector<int>.

Jua*_*uan 0

我将通过 C 接口使用共享指针返回对象。这样做的好处是,当对象不再可访问时,将调用适当的删除器。

\n\n

来自:\n http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

\n\n
\n

存储与r相关联的删除器以供将来删除被管理对象。

\n
\n\n

另请参阅 Scott Meyers 关于此主题的条目:

\n\n
\n

了解删除器在 Boost\xe2\x80\x99s shared_ptr\n 中的工作原理 http://www.artima.com/cppsource/top_cpp_aha_moments.html

\n
\n\n

更好的是这里接受的答案中对跨 DLL 问题的讨论:\n Is it OK to use boost::shared ptr in DLL interface?

\n\n

由于返回类型不是函数名称修饰的一部分。如果您愿意,您仍然应该能够使用 C 样式链接。

\n