【发布时间】:2018-04-24 06:26:09
【问题描述】:
我一直在使用 AppleLLVM 9.1.0(clang-902.0.39.1) 开发 os X 10.13,示例如下
#include <experimental/optional>
#include <iostream>
template<typename T>
class p {
public:
T value;
p(T& t):value(t){}
p(T const& t):value(t){}
~p() = default;
};
template <typename T1, typename T2>
constexpr auto operator+(p<T1> const &lhs, p<T2> const &rhs) noexcept {
return p<decltype(lhs.value + rhs.value)>(lhs.value + rhs.value);
}
int main(int, char* []) {
p<int> v1(20);
p<int> v2(10);
auto v3 = v1+v2;
std::cout << v3.value <<std::endl;
return 0;
}
用
编译c++ -std=c++17 -o test test.cpp
它非常适合我只是尝试使用N3638 中提到的返回类型推导的新功能,它提出了一种书面风格
template<typename T> auto f(T t);
但是,当我即将在我的 CMake(3.11.1) 组织项目中使用它时,几个标志显示如下:
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "-Wall -fpermissive -Wno-unused-parameter -Werror")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb3")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ggdb3 -DNDEBUG")
编译失败,告诉我“'auto' return without trailing return type; deduced return types are a C++14 extension”。 我尝试了下一个标志也得到了相同的结果:
set(CMAKE_CXX_FLAGS "-std=c++17")
它看起来很像环境设置失败的 CMake 问题,而我对我应该设置哪些 CMake 标志来启用这个新功能感到困惑?还是编译器相关的问题?
【问题讨论】:
-
(顺便说一句,“extensions off”和“-fpermissive”的组合没有意义)
-
@MarcGlisse 在问题中:CMake 3.11.1
-
你能看到cmake正在运行的编译器命令吗?如果你的生成器是
make,你可以写make VERBOSE=1,如果是ninja,你可以写ninja -v(我想)。我实际上不知道其他生成器 -
使用 gcc 或 clang 和 cmake-3.10.2 在 linux 上为我工作(我得到
-std=c++1z)。 -
@Justin 我已经导出了 env 变量和编译器设置为 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++,它链接到 clang 和最后它的版本正是我所描述的——Apple LLVM 版本 9.1.0 (clang-902.0.39.1)。