我正在使用VS 15.3,它支持集成的CMake 3.8.如何在不为每个特定编译器编写标志的情况下定位C++ 17?我当前的全局设置不起作用:
# https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# expected behaviour
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++lastest")
Run Code Online (Sandbox Code Playgroud)
我希望CMake在生成VS解决方案文件时添加"/ std:c ++ lastest"或等价物,但是没有找到c ++ 17标志,导致编译器错误:
C1189 #error: class template optional is only available with C++17.
Run Code Online (Sandbox Code Playgroud) 身份功能.
参数:x类型:'T(输入值)
返回值:相同的值
F#核心库版本,支持:2.0,4.0,Portable
为什么有一个返回其输入的函数?
我经常听说F#缺乏对OCaml行类型的支持,这使得语言比F#更强大.
这些是什么?它们是代数数据类型,例如总和类型(有区别的联合)还是产品类型(元组,记录)?是否可以在其他方言中写行类型,例如F#?
我经常需要为函数使用可选类型:
std::optional<int32_t> get(const std::string& field)
{
auto it = map.find(field);
if (it != map.end()) return it->second;
return {};
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在一行中返回可选值?例如:
std::optional<int32_t> get(const std::string& field)
{
auto it = map.find(field);
return it != map.end() ? it->second : {};
}
Run Code Online (Sandbox Code Playgroud)
导致错误
error: expected primary-expression before '{' token
return it != map.end() ? it->second : {};
^
Run Code Online (Sandbox Code Playgroud) 在
+与+.事去掉了很多微妙的错误的,可以在转换整数的大小不同突然出现,花车,和其他数字类型来回.这也意味着编译器总是确切地知道正在使用哪种数字类型,因此更容易识别程序员何时对一个始终具有整数值的数字做出错误的假设.要求在数字类型之间进行显式转换可能看起来很尴尬,但从长远来看,它可能会为您节省更多时间来追踪奇怪的错误,而不是花费额外的时间来明确表示.
ygrek还说:
你开始计算F#必须做的所有其他妥协,以支持这种重载.
有人可以解释一下OCaml中存在的"很多微妙的错误"以及F#除了发明解决方案静态解析类型之外还要做什么"所有妥协"?
polymorphism f# ocaml functional-programming operator-overloading
我有很多大于65535字节的字符串文字.我不允许将这些字符串保存为单独的文件,我如何解决字符串限制?
MSVC:2048
GCC:无限制(最多100,000个字符),但在510个字符后发出警告:
Run Code Online (Sandbox Code Playgroud)String literal of length 100000 exceeds maximum length 509 that C90 compilers are required to support
Scala中int,float和long的最大值为:
Int.MaxValue = 2147483647
Float.MaxValue = 3.4028235E38
Long.MaxValue = 9223372036854775807L
来自Scala编译器的作者,Keynote,PNW Scala 2013,幻灯片16 What's Int.MaxValue between friends?:
val x1: Float = Long.MaxValue
val x2: Float = Long.MaxValue - Int.MaxValue
println (x1 == x2)
// NO WONDER NOTHING WORKS
Run Code Online (Sandbox Code Playgroud)
为什么这个表达式会返回true?
我有一个NonCopyable类和一个Application类派生自NonCopyable:
class NonCopyable
{
public:
NonCopyable() = default;
virtual ~NonCopyable() = default;
NonCopyable(NonCopyable const&) = delete;
NonCopyable& operator =(NonCopyable const&) = delete;
NonCopyable(NonCopyable&&) = delete;
NonCopyable& operator=(NonCopyable&&) = delete;
};
class Application : public NonCopyable
{
public:
~Application() { /* ...delete stuff... */ }
};
Run Code Online (Sandbox Code Playgroud)
如您所见,我不需要重新声明已删除的移动构造函数或赋值运算符,因为我已在基类中声明它们.但为什么Resharper建议我宣布其他特殊成员职能呢?它说:
类
Application定义了非默认的析构函数,但没有定义复制构造函数,复制赋值运算符,移动构造函数或移动赋值运算符[hicpp-special-member-functions].还有[cppcoreguidelines-special-member-functions]提醒具有相同的消息.
目前的解决方法是明确地写下所有这些以使警告消失:
class Application : public NonCopyable
{
public:
~Application() { /* ...delete stuff... */ }
Application(Application const&) = delete;
Application& operator =(Application const&) = …Run Code Online (Sandbox Code Playgroud) 从文档页面:
CMAKE_BUILD_TYPE
指定单配置生成器上的构建类型。
这静态指定将在此构建树中构建哪种构建类型(配置)。可能的值是空的,
Debug,Release,RelWithDebInfo和MinSizeRel。此变量仅对单配置生成器(例如Makefile Generators和Ninja)有意义,即那些在CMake运行以生成生成树时选择单个配置的生成器,而与多配置生成器不同,后者在生成的生成环境中提供对构建配置的选择。有许多按配置的属性和变量(通常遵循SOME_VAR_<CONFIG>无序顺序约定),例如CMAKE_C_FLAGS_<CONFIG>,指定为大写:CMAKE_C_FLAGS_[DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL]。例如,在配置为build type的构建树中Debug,CMake将看到CMAKE_C_FLAGS_DEBUG已将设置添加到CMAKE_C_FLAGS设置。另请参阅CMAKE_CONFIGURATION_TYPES。
我知道之间的差异Debug构建和Release建立,但什么是之间的差异Release,RelWithDebInfo以及MinSizeRel?我猜的RelWithDebInfo意思是创建可调试的二进制文件,并MinSizeRel意味着创建可能的最小大小的二进制文件。
CMAKE_BUILD_TYPE:STRING
如果使用的是Visual Studio之类的IDE,则应使用IDE设置来设置构建类型。请注意,Release和RelWithDebInfo在大多数平台上使用不同的优化级别。
如果要生成生产版本,应该选择Release吗?