试图将 std::string 的向量转换为 const char* 的向量:
#include <algorithm>
#include <functional>
#include <string>
#include <vector>
int main(int argc, char** argv)
{
std::vector<std::string> values;
values.push_back("test1");
values.push_back("test2");
values.push_back("test3");
std::vector<const char*> c_values(values.size());
std::transform(values.begin(), values.end(), c_values.begin(), std::mem_fn(&std::string::c_str));
std::transform(values.begin(), values.end(), c_values.begin(), std::bind(&std::string::c_str, std::placeholders::_1));
std::transform(values.begin(), values.end(), c_values.begin(), [](const std::string& str) { return str.c_str(); });
return 0;
}
使用 g++ (4.7.2) 编译时,所有三个选项都可以正常编译和链接。使用 clang 编译时,选项 1 和 2 无法链接,产生:
$ clang -std=c++11 -stdlib=libc++ -lc++ stringtransform.cpp
Undefined symbols for architecture x86_64:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::c_str() const", referenced from:
_main in stringtransform-ff30c1.o
ld: symbol(s) not found for architecture x86_64
我发现如果我希望它使用 g++ 和 clang 跨平台正确链接,我需要使用 lambda 版本(选项 3)。我是否遇到了链接器错误或 clang 的 C++11 支持中的漏洞,或者我调用 mem_fn() 和 bind() 版本的方式有问题?
编辑:
最新的 Xcode(6.3.2,clang 版本 6.1.0)上仍然存在错误:
$ clang -v
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)