最近,我看到了一个奇怪的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?
看看这段代码:
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
.
但是,当我改变的顺序foo
和type_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) 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
我看到了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?
在阅读这个问题时,我发现了一个奇怪的观点:
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
在C++ 11和C++ 14中,
std::shared_ptr<T>
从以下构造a是有效的std::unique_ptr<T[]>
:Run Code Online (Sandbox Code Playgroud)std::unique_ptr<int[]> arr(new int[1]); std::shared_ptr<int> ptr(std::move(arr));
由于
shared_ptr
从中获取其删除(std::default_delete<T[]>
对象)unique_ptr
,因此将正确地释放数组.在C++ 17中不再允许这样做.而
std::shared_ptr<T[]>
应该使用数组形式 .
为什么在C++ 17中不允许这样做?发生了什么变化?
根据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()
.我该怎么用?
如果我们需要new
operator为对象分配内存,那么为什么我们不在数据类型之前使用它来分配内存?
class-name class-var = new class-name();
new int a;
Run Code Online (Sandbox Code Playgroud) 看看代码:
#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) 这个问题是在我回答另一个问题的时候提出的.
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++ ×7
c++11 ×2
async-await ×1
boost-asio ×1
boost-thread ×1
c# ×1
c++17 ×1
capslock ×1
decltype ×1
java ×1
new-operator ×1
remap ×1
shared-ptr ×1
templates ×1
typename ×1
vim ×1
windows ×1