小编Cor*_*lks的帖子

字符串作为模板参数

虽然C++标准不允许使用字符串文字作为模板参数,但允许这样的事情:

ISO/IEC 14882:2011

14.3.2模板非类型参数[temp.arg.nontype]

2 [注意:字符串文字(2.14.5)不满足任何这些类别的要求,因此不是可接受的模板参数.[例如:

template<class T, const char* p> class X { / ... / };

X<int, "Studebaker"> x1; // error: string literal as template-argument

const char p[] = "Vivisectionist";
X<int,p> x2; // OK

- 末端示例] - 尾注]

那么为什么以下代码在所有编译器中都会出错(gcc 4.7.2,MSVC-11.0,Comeau)?

template <const char* str>
void foo() {}

int main()
{
   const char str[] = "str";
   foo<str>();
}
Run Code Online (Sandbox Code Playgroud)

c++

4
推荐指数
1
解决办法
228
查看次数

"静态初始化"究竟是什么意思?

我一直在阅读C++ 11中的POD,我读过的几个地方已经说过一些关于支持静态初始化的POD.例如:

在StackOverflow上:

POD的想法是捕获基本上两个不同的属性:
1.它支持静态初始化,以及
2.在C++中编译POD为您提供与在C中编译的结构相同的内存布局.

(只有粗体部分是相关的)

在维基百科上:

可以静态初始化一个简单的类型.

显然我不明白静态初始化是什么.我认为制作一个全局变量是一个静态初始化的例子,但我可以做以下但Foo不是POD:

#include <type_traits>
#include <iostream>

struct Foo {
  Foo() : x(0), y(0) {}
  int x;
  int y;
};

struct Bar {
  Bar() = default;
  int x;
  int y;
};

// Apparently the following two lines are not "static initialization" because
// Foo is non-POD yet we can still do this:
Foo f;
Bar b;

int main()
{
    if (std::is_pod<Foo>::value) std::cout << "Foo is a POD" …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

4
推荐指数
3
解决办法
392
查看次数

导出没有架构的表数据?

我已经尝试过搜索这个但是到目前为止我只找到"导出没有数据的表模式"的结果,这与我想要做的完全相反.有没有办法从SQL表导出数据而不用脚本重新创建表?

如果有人有更好的解决方案,我试图解决的问题是:我有两个数据库,每个数据库在不同的服务器上; 我将它们称为原始数据库和分析数据库.原始数据库是"真实"数据库,它收集发送到其服务器的记录,并使用事务InnoDB引擎将它们存储在表中.分析数据库位于内部LAN上,用于镜像原始数据库,并定期更新,以便与原始数据库匹配.它是这样分开的,因为我们有一个程序可以对数据进行一些分析和处理,我们不想在实时服务器上进行.

因为分析数据库只是一个副本,所以它不需要是事务性的,我希望它使用MyISAM引擎作为其表,因为我发现将数据导入和查询要快得多.问题是,当我从实时原始数据库导出表时,表模式也被导出,表引擎设置为InnoDB,因此当我运行脚本将数据导入分析数据库时,它会删除MyISAM表并将其重新创建为InnoDB表.我想自动执行导出/导入数据的过程,但是生成的sql脚本文件将表引擎从MyISAM更改为InnoDB的问题阻止了我,我不知道如何绕过它.我知道的唯一方法是编写一个程序,可以直接访问实时原始数据库,进行查询,并使用结果更新分析数据库,但我正在寻找替代方案.

mysql sql

3
推荐指数
1
解决办法
2760
查看次数

隐含功能声明在C89中是合法的吗?

考虑这个C程序:

int main()
{
    puts("Hello world!");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行正常,据我所知,是合法的C89.但是,我不是百分百肯定的.使用clang在C99模式下编译告诉我implicit declaration of function 'puts' is invalid in C99(这使我认为C标准必须在C99中更改以使隐式函数声明非法,这是我正在尝试确认的).

隐含功能声明在C89中是合法的吗?(即使这样做是个坏主意(除非你在混淆的C代码挑战中))

c c89 language-lawyer

3
推荐指数
1
解决办法
585
查看次数

为什么指针导致内存泄漏动态分配整数?

"因为pnValue是唯一保存动态分配整数地址的变量,所以当pnValue被销毁时,不再有对动态分配内存的引用.这称为内存泄漏.因此,无法删除动态分配的整数,因此无法重新分配或重用." {引自LearnCpp.}

为什么pnValue保存动态分配的整数的地址?如果指针只指向地址,为什么破坏指针会影响地址?这是否意味着在动态分配的整数中,我们必须总是有指针,因为指针不知何故地址?

c++ memory pointers memory-leaks

2
推荐指数
1
解决办法
1923
查看次数

关于模板类专业化的范例

我目前正在编写一个模板类,用于存档(或序列化)和从二进制格式中取消存档数据.首先,我试图关闭我将使用的模式.我主要倾向于使用模板,因为unarchivers没有方法重载的输入类型.例如,以下示例是正常的:

Archiver ar;
int i;

archive(ar, i);
Run Code Online (Sandbox Code Playgroud)

但它的对手不是:

Unarchiver unar;
int i;

i = unarchive(unar);
Run Code Online (Sandbox Code Playgroud)

我想避免使用函数的名称,例如unarchive_int因为使用模板时会很麻烦.说:

template <class T> class SomeClass
{
public:

   void doSomething()
   {
      // Somewhere
      T value = unarchive(unar);
   }
};
Run Code Online (Sandbox Code Playgroud)

这会使事情变得混乱,因此我真的使用模板,而前一个表达式将是T value = unarchive<T>(ar);.如果第一个或唯一的参数始终是archiver和unarchiver对象,那么写一个全局函数似乎也很愚蠢(可以说); 模板类似乎是有序的:

template <class T> class Archiver
{
public:

    void archive(T obj);
};
Run Code Online (Sandbox Code Playgroud)

这样可行,但归档方法始终复制其输入对象.对于POD数据类型,这是可以的,但不是那么多类.解决方案似乎很明显,而是使用const引用void archive(const T & obj),但现在通过引用传递整数,浮点数和其他POD似乎也很愚蠢.虽然我对这个解决方案感到满意,但我还是试着进一步让对象做出区分.我的第一种方法是std::enable_if,默认情况下假设一个副本(对于所有非类成员)并提供类特化,其中archive方法通过引用获取其输入.它不起作用.这是代码:

template <class T, class E = void>
class Archiver
{
public:

    // By default, obj …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-specialization c++11

2
推荐指数
1
解决办法
72
查看次数

为什么这个static_assert只在OS X上的clang失败而在其他地方都没有?

以下代码:

#include <cstdint>
#include <type_traits>

enum class Enum : std::uint64_t {
    zero,
};

static_assert(std::is_same<std::make_unsigned<Enum>::type, std::uint64_t>::value, "");
Run Code Online (Sandbox Code Playgroud)

无法使用clang在OS X上编译:

$ clang++ -std=c++11 -c t.cpp
t.cpp:8:1: error: static_assert failed ""
static_assert(std::is_same<std::make_unsigned<Enum>::type, std::uint64_t>::value, "");
^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated
Run Code Online (Sandbox Code Playgroud)

但是,同样的文件可以在gcc.godbolt.org上使用clang 3.8/3.7.1/3.7/3.6/3.5.1/3.5/3.4.1/3.3 .

在我的系统上,clang只是Xcode 7.3.1的正常版本:

$ clang++ --version
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?这显然似乎是我系统中的一个错误,但是我不清楚为什么这会因为Xcode的clang而不是任何其他版本的clang而失败.Xcode的clang分布是否有明显不同?

c++ clang c++11

2
推荐指数
1
解决办法
559
查看次数

在声明for循环变量时,&mut会做什么吗?

考虑以下(哑)程序:

fn main() {
    let mut array = &mut [1u8, 2u8, 3u8];
    for &mut value in array {
    }
}
Run Code Online (Sandbox Code Playgroud)

它编译并运行正常(虽然警告未使用的变量/不必要的可变性,如预期的那样).但是&mutfor声明中做了什么?

它似乎没有给你一个可变的数组引用,因为尝试value = 0;在错误中分配结果:

error[E0384]: re-assignment of immutable variable `value`
Run Code Online (Sandbox Code Playgroud)

这是&mut一个无操作吗?

rust

2
推荐指数
1
解决办法
364
查看次数

是否有其他方法可以捕获带有条件变量的潜在遗漏信号?

请考虑以下简化示例:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mutex;
std::condition_variable cv;
bool cv_flag = false; // I'm talking about this flag here

void startThread1()
{
    std::cout << "thread 1 prints first\n";
    {
        // Set the flag (lock to be safe)
        std::unique_lock<std::mutex> lock(mutex);
        cv_flag = true;
    }
    cv.notify_one();
}

void startThread2()
{
    std::unique_lock<std::mutex> lock(mutex);
    if (!cv_flag)
    {
        cv.wait(lock);
    }

    std::cout << "thread 2 prints second\n";
}

int main()
{
    std::thread thread1(startThread1);
    std::thread thread2(startThread2);

    thread1.join();
    thread2.join();
}
Run Code Online (Sandbox Code Playgroud)

这里,cv_flag用于确保线程2没有锁定, …

c++ multithreading c++11

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

我可以减去或比较受限制的指针吗?

题:

如果我有两个指针(基本上是a begin和a end),它们是合格的restrict.所述begin指针被用于非关联化/读取,和所述end指针是一过去最端指针被解除引用从未和仅用于(通过检查范围的大小end - begin).一旦消耗了范围,我期望begin并且end相等并且end - begin为0,尽管此时两个指针永远不会被解除引用.

鉴于restrict对指针的限制,是否需要明确定义的行为来减去和比较这两个指针?

MVCE:

我有一些代码如下:

#include <stddef.h>

struct Reader {
  const char* restrict data;
  size_t size;
};

char read_char(struct Reader* reader) {
  --reader->size;
  return *reader->data++;
}

int main(int argc, char* argv[]) {
  struct Reader reader = {
    .data = argv[1],
    .size = argv[1] ? strlen(argv[1]) : 0,
  };

  if (reader.size > 0) {
    return read_char(&reader);
  } …
Run Code Online (Sandbox Code Playgroud)

c pointers restrict

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

为什么 `SFINAE` (std::enable_if) 使用 bool 文字而不是 `true_t` / `false_t` 标记类?

我正在尝试了解SFINAE(我正在关注本教程),但有一些......“设计选择”我不理解,因此,我发现它们令人困惑。

假设我遇到这样的情况(包括重新实现std::enable_ifis there 只是为了演示我是如何理解的enable_if

// A default class (class type) declaration. Nothing unusual.
template <bool, typename T = void>
struct enable_if
{}; 

// A specialisation for <true, T> case. I understand 'why-s' of this. 
// -- 'why-s': if I attempt to access 'enable_if<false, T>::type' (which does not exist) I will get a substitution failure and compiler will just "move-on" trying to match "other cases".
template <typename T>
struct enable_if<true, T> {
    typedef …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae

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

检查到目前为止我在C++中使用了哪些值的最快方法是什么?

一个片段

if (a<=lim){
    if(std::find(prims.begin(), prims.end(), a)==prims.end()){
        prims.push_back(a);
        count+=lim/a;
    }         
}
Run Code Online (Sandbox Code Playgroud)

所以基本上我在我的代码中有这个部分,如果它不存在,我将变量添加a到此vector,然后我即时更新计数器.

但我想知道这在运行时是否不是最理想的.我能做得更快吗?

c++ vector

0
推荐指数
1
解决办法
56
查看次数