小编ikh*_*ikh的帖子

为什么有注入的类名?

最近,我看到了一个奇怪的C++特性:注入类名.

class X { };
X x1;
class X::X x2; // class X::X is equal to X
class X::X::X x3; // ...and so on...
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚为什么这个功能是必要的.有没有需要此功能的练习?

我听说旧C++中不存在这个功能.然后,什么时候介绍?C++ 03?C++ 11?

c++

142
推荐指数
1
解决办法
6321
查看次数

为什么声明顺序对于将成员函数指针作为模板参数传递很重要?

看看这段代码:

template <typename T, void (T::*pfn)()> struct Testee {};

class Tester
{
private:
    void foo() {}
public:
    using type_t = Testee<Tester, &Tester::foo>;    
};
Run Code Online (Sandbox Code Playgroud)

它成功编译g++ -std=c++14 -Wall -Wextra.

但是,当我改变的顺序footype_t,发生错误:

$ cat test.cpp
template <typename T, void (T::*pfn)()> struct Testee {};

class Tester
{
public:
    using type_t = Testee<Tester, &Tester::foo>;
private:
    void foo() {}
};

int main()
{
}

$ g++ -std=c++14 -Wall -Wextra -pedantic test.cpp
test.cpp:6:36: error: incomplete type ‘Tester’ used in nested name specifier …
Run Code Online (Sandbox Code Playgroud)

c++ templates member-pointers

23
推荐指数
1
解决办法
1185
查看次数

在任务中抛出异常 - "等待"与等待()

static async void Main(string[] args)
{
    Task t = new Task(() => { throw new Exception(); });

    try
    {                
        t.Start();
        t.Wait();                
    }
    catch (AggregateException e)
    {
        // When waiting on the task, an AggregateException is thrown.
    }

    try
    {                
        t.Start();
        await t;
    }
    catch (Exception e)
    {
        // When awating on the task, the exception itself is thrown.  
        // in this case a regular Exception.
    }           
}
Run Code Online (Sandbox Code Playgroud)

在TPL中,当在Task中抛出异常时,它被包装为AggregateException.
但是使用await关键字时也不会发生同样的情况.
这种行为的解释是什么?

c# exception-handling parallel-extensions task-parallel-library async-await

20
推荐指数
2
解决办法
2万
查看次数

为什么在Vim中将Esc重新映射到CAPS LOCK如此复杂?

我看到了vim wiki提示,它说为了将Esc重新映射到CAPS LOCK,你必须编辑以下windows代码:

REGEDIT4
[HKEY_CURRENT_USER\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,01,00,3a,00,00,00,00,00
Run Code Online (Sandbox Code Playgroud)

是否可以通过仅添加或修改_vimrc中的行来将Esc重新映射到CAPS LOCK?

windows vim capslock remap

19
推荐指数
1
解决办法
1万
查看次数

C++在继承构造函数中使用带有typename的声明

在阅读这个问题时,我发现了一个奇怪的观点:

template <typename T>
class Subclass : public Baseclass<T>
{
public:
    using typename Baseclass<T>::Baseclass;
    //    ^^^^^^^^
};
Run Code Online (Sandbox Code Playgroud)

既然typename,Baseclass<T>::Baseclass应该注入类名,而不是构造函数.据我所知,情况与此相同:

template <typename T>
class Base
{
public:
    typedef short some_type;
};

template <typename T>
class Sub : public Base<T>
{
public:
    using typename Base<T>::some_type;
};
Run Code Online (Sandbox Code Playgroud)

为了确保,我写了一个测试代码.

#include <iostream>

template <typename T>
class Base
{
public:
    Base() { std::cout << "A::A()\n"; }
    Base(int) { std::cout << "A::A(int)\n"; }
    Base(const char *) { std::cout << "A::A(const …
Run Code Online (Sandbox Code Playgroud)

c++ typename using-declaration language-lawyer inheriting-constructors

13
推荐指数
1
解决办法
857
查看次数

为什么不再允许从array的unique_ptr创建shared_ptr?

cppreference:

在C++ 11和C++ 14中,std::shared_ptr<T>从以下构造a是有效的std::unique_ptr<T[]>:

std::unique_ptr<int[]> arr(new int[1]);
std::shared_ptr<int> ptr(std::move(arr));
Run Code Online (Sandbox Code Playgroud)

由于shared_ptr从中获取其删除( std::default_delete<T[]>对象)unique_ptr,因此将正确地释放数组.

在C++ 17中不再允许这样做.而std::shared_ptr<T[]>应该使用数组形式 .

为什么在C++ 17中不允许这样做?发生了什么变化?

c++ shared-ptr c++17

11
推荐指数
1
解决办法
852
查看次数

boost :: asio with boost :: unique_future

根据http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview/cpp2011/futures.html,我们可以使用boost :: asio std::future.但我找不到任何有关使用的信息boost::unique_future,它有更多的功能,例如then().我该怎么用?

c++ boost-thread boost-asio

9
推荐指数
1
解决办法
1834
查看次数

在java中,为什么new运算符在数据类型之前没有用来分配内存?

如果我们需要newoperator为对象分配内存,那么为什么我们不在数据类型之前使用它来分配内存?

class-name class-var =  new class-name();
new int a;
Run Code Online (Sandbox Code Playgroud)

java new-operator

8
推荐指数
1
解决办法
491
查看次数

为什么我可以在decltype()中使用私有默认构造函数?

看看代码:

#include <iostream>
#include <utility>

class test
{
private:
    test() { }
public:
    test foo() { return *this; }

    static const char *name() { return "test"; }
};

int main()
{
    std::cout << decltype(test().foo())::name() << std::endl;               // 1
    std::cout << decltype(std::declval<test>().foo())::name() << std::endl; // 2
}
Run Code Online (Sandbox Code Playgroud)

我期望// 1行无法编译,因为默认构造函数test是private.

但是,它运作良好.-Wall -Wextra -Werror -pedantic怀疑地在g ++ 4.8.3上对它进行了测试,但它运行良好,没有任何错误或警告.

(此外,它似乎也适用于GCC 4.9.1.)

这个页面,我想如果表达式未被评估,我们可以使用私有默认构造函数.所以,我测试了以下内容来检查它.

#include <iostream>
#include <utility>

class test
{
private:
    test(int) { }
public:
    test foo() …
Run Code Online (Sandbox Code Playgroud)

c++ decltype private-members language-lawyer c++11

7
推荐指数
1
解决办法
766
查看次数

std :: vector :: resize(size_type)需要CopyInsertable吗?

这个问题是在我回答另一个问题的时候提出的.

N3337 23.3.6.3"向量容量"表示(见770页):

void resize(size_type sz);

E ff ects:If sz <= size(),相当于erase(begin() + sz, end());.如果size() < sz,将sz - size()值初始化元素附加 到序列.

要求:T应为CopyInsertable到*this.

然而,clang ++表示虽然T不可复制但也没关系.而且我认为resize(size_type)只需要可破坏/可移动/默认构造就可以了.如果sz <= size,追加(如果容量不够,则追加(使用默认构造,销毁和移动))size() < sz.

什么是真理?这是标准缺陷吗?或者这是clang ++和我的错误吗?

c++ language-lawyer c++11

6
推荐指数
1
解决办法
134
查看次数