草庐IT

c++ - C++17 会允许嵌套类的前向声明吗?

不知道在哪里问(如果这是一个不恰当的问题,请随时关闭它)但我在C++17提案中没有找到任何关于此的内容,this也没有。或this在处理C++的嵌套命名空间添加时提到它。所以目前这是唯一的选择:classA{public:classB;//forward-declaredINSIDEclass/namespace};classA::B//definedoutside{};这在C++17中是否可行?classA::B;//forwarddeclaredNESTEDoutsideofparentclass/namespaceclassC{A::B*b;};然后是这个(1)(似乎是嵌套命名空

c++ - 将两个 char* 带入另一个 std::string 的字符串构造函数在 c++14 中有效,但在 c++17 中无效

以下程序尝试使用第一个字符串和指向第一个字符串中间的指针构造第二个字符串:#includeintmain(){std::stringsrc="helloworld";constchar*end=&src[5];std::stringdest(src.data(),end);}在C++14及更早版本中,这有效。但是inC++17thecallfails:error:nomatchingfunctionforcallto‘std::__cxx11::basic_string::basic_string(char*,constchar*&)’std::stringdest(src.data(

C++17 和十进制浮点的当前状态

C++中十进制浮点的现状如何?我特别关注语言包容性、标准合规性和可移植性的状态。有许多“官方”库基于现有标准(尤其是IEEE754-2008),这些标准被认为是纳入标准的基础:BloombergBDLDecimalFloatLibrarylibdfp(originallyIBMDecimalFloatingPointLibrary)此外,还有一个proposal将十进制float添加到C++14。根据thispost中的提议者它没有及时提交以供收录(请参阅答案评论)。我还检查了C++17features的许多来源。,但我找不到十进制float。我知道一些编译器(例如GCC和Clang)

c++ - 不可移动的 C++17 唯一指针

我遇到了这个答案Preventmovingofaunique_ptrC++11.但是,在在线编译器上试用它时,这适用于C++11(std::move编译器错误),但对于C++17,我看到std::move下面是成功的。编译器不应该在该行抛出错误吗?此外,如果C++17中的某些语义发生了变化,那么在C++17及更高版本中创建不可移动的unique_ptr的正确方法是什么。templateusingscoped_ptr=conststd::unique_ptr;intmain(){autop=scoped_ptr(newint(5));autop2=std::move(p);//shoul

c++ - GCC 和 Clang 不同意 C++17 constexpr lambda 捕获

考虑这个例子,它将一个变量声明为constexpr,通过在lambda中复制来捕获它,并声明另一个constexpr变量,该变量是constexpr函数从原始变量中解包非类型模板参数的结果。#includetemplateconstexprautounwrap(std::integral_constant){returnI;}intmain(){constexprautoi=std::integral_constant{};constexprautol=[i](){constexprintx=unwrap(i);};}Clang(主干)接受此代码。(wandbox)GCC(trunk)

c++ - 为什么 C++17 中的全局内联变量和静态内联成员需要守卫?

从C++17开始,可以使用inline关键字初始化header中的全局变量和静态成员。虽然我理解为什么函数中的静态变量需要被保护(因为即使在多线程上下文中初始化也应该只发生一次),但我不明白为什么这些新的内联变量也被保护(你可以在这里看到它:https://godbolt.org/z/YF8PeQ).我认为在任何情况下,所有全局变量和静态成员的初始化都发生在程序执行开始时(甚至在main()之前),因此此时无需考虑多个线程。请解释一下好吗? 最佳答案 每个包含定义并使用它的文件都会尝试初始化变量。即使这种情况是连续发生的,而不是同时

c++ - C++17 异常说明符类型系统将如何工作?

研究“noexcept说明符(和运算符)”,我写了一个简单的代码。我很惊讶这段代码:voidasdf()noexcept{}intmain(){autof=asdf;std::cout打印false,甚至函数“asdf”也没有指定。所以在寻找为什么会发生这种神秘现象时,我发现了C++17的“异常说明符类型系统”-P0012R1.根据这个(接受的)提案,从C++17开始;由于noexcept是函数类型的一部分,上面的代码会打印true吗?还有一个,在this问题的一行:std::functionfnoexcept指定在C++14或11中似乎被忽略了。这段代码会在C++17中按预期工作吗?

c++ - 为什么 std::allocator 在 C++17 中丢失了成员类型/函数?

在查看std::allocator时,我看到成员(member):value_type,指针,const_pointer,引用,const_reference,size_type,difference_type,以及rebind已全部弃用。分配器也将不再拥有成员:address、max_size、construct或destroy。为什么会这样?是否与多态分配器有关? 最佳答案 如果您查看therelevantisocpppaper你可以看到你提到的第一个集合现在被认为放在std::allocator_traits中更好。.自从ST

c++ - 为什么在c++14中定义了shared_timed_mutex,而在c++17中定义了shared_mutex?

C++11引入了std::mutex及其扩展版本-std::timed_mutex。但是,在c++14中,我们有std::shared_timed_mutex,但它的“父级”std::shared_mutex将在c+中添加+17。对此有什么合理的解释吗?如果我不打算使用std::shared_timed_mutex的“定时”功能,它会比建议的std::shared_mutex更糟(更慢,消耗更多资源)吗?? 最佳答案 Sharedmutex原来是有计时的,叫做shared_mutex。实现者(msvciirc)指出,他们可以在没有时

c++ - 在 C++17 中使用空列表初始化构造函数时出现编译错误

我在尝试迁移到C++17时遇到了一个奇怪的问题。问题是C++17中发生了一些变化(我不确定是什么),这使得列表初始化在默认构造函数的情况下工作方式不同。我试图搜索https://en.cppreference.com/w/cpp/language/list_initialization了解更多信息,但我没有找到任何看起来相关的内容。有人知道下面的代码在调用B{}而不是B()时在C++14中编译但在C++17中编译的原因吗?(我在gcc8.2和7.3以及icc19中都尝试过)structA{protected:A(){}};structB:publicA{};Bf(){returnB()