在对这篇文章的回答“ (部分地)专门化非依赖types的非types模板参数 ”中,它指出: 对应于专门的非types参数的模板参数的types不应该依赖于专门化的参数。 [例如: template <class T, T t> struct C {}; template <class T> struct C<T, 1>; // error template< int X, int (*array_ptr)[X] > class A {}; int array[5]; template< int X > class A<X,&array> { }; // error – 例子] 我的问题是为什么这个限制在这里? 至less有一个用例,我发现这个限制干扰了编写干净的代码。 例如 template <typename T, T*> struct test; template <typename […]
考虑下面的代码片段: struct A { auto foo(), bar(); }; auto A::foo() { return 1; } auto A::bar() { return 'a'; } int main() { } 它在Clang ++ 3.7.0中编译得很好。 它在G ++ 5.2.0中失败 : main.cpp: In member function 'auto A::bar()': main.cpp:7:24: error: inconsistent deduction for 'auto': 'int' and then 'char' auto A::bar() { return 'a'; } 自动返回types推演是否强制在单个语句中声明的多个函数具有相同的返回types?
我在Ubuntu 14.04 LTS上使用g ++ 4.8.4。 当试图用'-std = c ++ 14'编译时,我得到这个错误: g++: error unrecognized command line option '-std=c++14' 用'-std = c ++ 11'编译工作正常,所以我不知道发生了什么事情。 g ++真的不支持c ++ 14吗? 我使用错误的命令行选项? 我用“sudo apt-get install g ++”应该自动检索最新版本,是不是正确?
我正在阅读“Effective Modern C ++”。 在与std::unique_ptr相关的项目中,声明如果定制删除器是一个无状态对象,则不会发生大小的费用,但是如果它是一个函数指针或std::function大小的费用发生。 你能解释一下为什么? 假设我们有以下代码: auto deleter_ = [](int *p) { doSth(p); delete p; }; std::unique_ptr<int, decltype(deleter_)> up(new int, deleter_); 据我的理解, unique_ptr应该有一个types为decltype(deleter_)的对象,并为该内部对象分配deleter_ 。 但显然这不是发生了什么事情。 你可以用最小的代码示例来解释这个机制吗?
C ++ 14将允许创build模板化的variables。 通常的例子是一个variables“pi”,它可以被读取以得到各种types的math常数π的值( int为3; float为最可能的值) 除此之外,我们可以通过在模板化的结构或类中包装一个variables来实现这个function,这与types转换是如何结合的? 我看到一些重叠。 除了pi的例子之外,它是如何处理非constvariables的呢? 任何使用示例,了解如何充分利用此function以及它的目的是什么?
假设我想为16位块中的64位整数创build编译时构造的位计数查找表。 我知道这样做的唯一方法是下面的代码: #define B4(n) n, n + 1, n + 1, n + 2 #define B6(n) B4(n), B4(n + 1), B4(n + 1), B4(n + 2) #define B8(n) B6(n), B6(n + 1), B6(n + 1), B6(n + 2) #define B10(n) B8(n), B8(n + 1), B8(n + 1), B8(n + 2) #define B12(n) B10(n), B10(n + […]
考虑以下: template<typename Der> struct Base { // NOTE: if I replace the decltype(…) below with auto, code compiles decltype(&Der::operator()) getCallOperator() const { return &Der::operator(); } }; struct Foo : Base<Foo> { double operator()(int, int) const { return 0.0; } }; int main() { Foo f; auto callOp = f.getCallOperator(); } 我想根据派生类中operator()签名在CRTP基类中创build一个返回types的成员函数。 然而decltype(&Der::operator())不能编译; Foo的operator()成员函数不可见。 我认为这是因为基类模板在Foo完全定义之前被实例化。 令人惊讶的是,如果我放置auto返回types它编译。 […]
比方说,我有工厂函数处理基类和派生类: #include <memory> using namespace std; struct B { virtual ~B() {} }; struct D : B {}; unique_ptr<B> MakeB() { auto b = unique_ptr<B>( new B() ); return b; // Ok! } unique_ptr<B> MakeD() { auto d = unique_ptr<D>( new D() ); return d; // Doh! } 在上面的最后一行,我需要move(d)为了使其工作,否则我得到“错误:从std::unique_ptr<D>无效转换为std::unique_ptr<D>&& 。 我的直觉说,在这种情况下,编译器应该知道它可以隐含地将一个右值赋给基指针,但是它不会。 这是不符合我的编译器(gcc 4.8.1和VS2012)? unique_ptr的预期devise? 标准中的缺陷?
考虑下面的一段代码,C ++ 11编译器完全可以接受这段代码: #include <array> #include <iostream> auto main() -> int { std::array<double, 0> A; for(auto i : A) std::cout << i << std::endl; return 0; } 根据标准§23.3.2.8[ 零尺寸arrays ]: 1arrays应提供对特殊情况N == 0 。 2在N == 0的情况下, begin() == end() ==唯一值。 返回值 data()是未指定的。 3调用front()或back()调用一个零大小的数组是没有定义的。 4成员函数swap()应该有一个noexcept-speci fi cation,相当于noexcept(true) 。 如上所示,在C ++ 11中,零大小的std::array是完全允许的,与零大小的数组(例如, int A[0]; )相比,它们被明确禁止,但它们被一些编译器例如GCC)以未定义的行为为代价。 考虑到这个“矛盾”,我有以下几个问题: […]
C ++ 98有front_inserter , back_inserter和inserter ,但是在C ++ 11或者C ++ 14中似乎没有这些版本的版本。 有没有技术原因,我们不能有front_emplacer , back_emplacer和emplacer ?