【发布时间】:2019-02-18 00:27:46
【问题描述】:
使用 Xcode 10 GM 编译以下程序时:
#include <iostream>
#include <string>
#include <variant>
void hello(int) {
std::cout << "hello, int" << std::endl;
}
void hello(std::string const & msg) {
std::cout << "hello, " << msg << std::endl;
}
int main(int argc, const char * argv[]) {
// insert code here...
std::variant< int, std::string > var;
std::visit
(
[]( auto parameter )
{
hello( parameter );
},
var
);
return 0;
}
我收到以下错误:
main.cpp:27:5:调用不可用函数“visit”:在 macOS 10.14 中引入
但是,如果我将最小部署目标更改为 macOS 10.14,即使我运行的是 macOS 10.13,代码也可以正常编译并且可以正常工作。
由于std::visit 是函数模板,并且不应该依赖于操作系统版本(我通过在低于实际支持的mac 版本上运行代码来证明这一点),这是否应该被视为错误并报告给Apple 或者这是预期的行为?
在为 iOS 编译时也会发生同样的情况(至少需要 iOS 12)。
【问题讨论】:
-
现在这对我来说听起来像是预期的行为。您的操作系统无关紧要,部署目标是唯一重要的事情。对于 =10.14 它会。还是我错过了什么?
-
但是如果我使用部署目标 iOS 12 进行编译,链接器还将包含其他仅适用于 iOS 12 的功能,并且二进制文件将不再适用于 iOS 8。我不明白为什么这个函数是C++17 standard 的一部分并且不应该依赖于操作系统版本,它依赖于macos 10.14 和ios 12?
-
std::visit是一个函数模板,因此它不能成为仅随 iOS 12 和 macOS 10.14 一起提供的某些动态库的一部分。作为一个函数模板,它完全在标头中实现,并在调用代码中内联,因此不应该依赖于任何操作系统版本。 -
@DoDo:这是基于过度简化的错误假设。至少非常,允许你提出的建议绝对是一场后勤噩梦。实际上,支持它没有任何好处。最好有 一个 版本的您使用的实现,并且不关心哪些部分可以构建到可执行文件中,哪些部分可以在运行时库中找到。