小编Ofe*_*lon的帖子

C++ decltype 和括号 - 为什么?

该主题之前讨论 ,但这不是重复的。

当有人问decltype(a)及 和之间的区别时decltype((a)),通常的回答是 -a是一个变量,(a)是一个表达式。我觉得这个答案并不令人满意。

首先,a也是一个表达式。主要表达式的选项包括 -

  • ( 表达 )
  • id 表达式

更重要的是, decltype 的措辞非常非常明确地考虑了括号

For an expression e, the type denoted by decltype(e) is defined as follows:
(1.1)  if e is an unparenthesized id-expression naming a structured binding, ...
(1.2)  otherwise, if e is an unparenthesized id-expression naming a non-type template-parameter, ...
(1.3)  otherwise, if e is an unparenthesized id-expression or …
Run Code Online (Sandbox Code Playgroud)

c++ decltype language-lawyer c++11

31
推荐指数
2
解决办法
1182
查看次数

为什么规范禁止将类类型传递给变量参数C++函数?

通过非荚可变参数函数,如printf是未定义的行为(1,2),但我不理解为什么 C++标准设定这种方式.变量arg函数中是否存在任何固有的东西阻止它们接受类作为参数?

变量arg callee确实对它们的类​​型一无所知 - 但它也不知道它接受的内置类型或普通POD.

此外,这些必然是cdecl函数,因此调用者可以负责例如在传递时复制它们并在返回时销毁它们.

任何见解将不胜感激.


编辑:我仍然没有看到为什么建议的可变参数语义不起作用,但zneak的答案很好地说明了将编译器调整到它需要什么 - 所以我接受了它.最终,这可能是一些历史故障.

c++ variadic-functions language-lawyer

24
推荐指数
3
解决办法
918
查看次数

R data.table 奇怪的值/引用语义

(这是一个跟进问题这个。)

检查这个玩具代码:

> x <- data.frame(a = 1:2)
> foo <- function(z) { setDT(z) ; z[, b:=3:4] ; z } 
> y <- foo(x)
> 
> class(x)
[1] "data.table" "data.frame"
> x
   a
1: 1
2: 2
Run Code Online (Sandbox Code Playgroud)

看起来 setDT 确实改变了 x 的类,但是添加的数据不适用于 x。
这里发生了什么?

r data.table

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

从IDE禁用C++ PDB生成

我们需要抑制调试符号的生成.项目属性/配置属性/ c/c ++/general/debug信息格式下可用的选项等同于/ Z7,/ Zi和/ ZI - 我找不到完全省略/ Zx标志的方法.

此处的情况不同- 我们正在从IDE构建.

我正在使用visual studio 2010,而手头的项目是一个静态库.

编辑:这是我安装VS2012的视图.这是一些安装问题吗?您的Debug-Information-Format选项有何不同? 在此输入图像描述

visual-studio-2010 visual-c++ pdb-files

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

COM/OLE/ActiveX/IDispatch混淆

我无法理解这些术语之间的差异.

COM和ActiveX是同义词吗?

ActiveX对象只是一个公开IDispatch的COM对象吗?

很多旧的MSDN页面都提到没有任何COM上下文的IDispatch.它是否有单独的历史记录,并且刚刚在其生命周期的后期在COM"保护伞"下引入?

OLE适合哪里?它(可观)是否存在于MFC命名和MSDN中 - 所有这些都只是遗产?

维基百科提供了一些见解,但并不多.我找不到更深入的参考资料.

com activex ole idispatch

7
推荐指数
2
解决办法
2486
查看次数

我应该将二进制资产保留在TFS下吗?怎么样?

我们的产品类似游戏,并且非常丰富(~40M - 100M)二进制支持文件 - 纹理,网格,电影等. 像kai1968一样,我希望能够同步这些资产,而不仅仅是代码,只需单击一下.

然而,严格地说,这与版本控制不同:我不想让我们的TFS负担这些文件的无关历史.我可以以某种方式上传内容而不保留历史记录到TFS吗?如果我可以选择在特定点(比如标签点)保留历史记录,而不是每次签到都会更好.

更一般地说,您如何管理二进制资产的同步?

(我知道其他工具,可能更适合这样的任务,但是现在不能从TFS分歧 - 或者完全迁移 - 不是一种选择.)

version-control tfs digital-assets

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

fscanf/fscanf_s的行为差异

我对以下行为差异感到困惑:

// suppose myfile.txt contains a single line with the single character 's'
    errno_t res;
    FILE* fp;
    char cmd[81];

    res = fopen_s(&fp, "D:\\myfile.txt", "rb" );
    fscanf(fp,"%80s",cmd); // cmd now contains 's/0'
    fclose(fp);

    res = fopen_s(&fp, "D:\\myfile.txt", "rb" );
    fscanf_s(fp,"%80s",cmd); // cmd now contains '/0' !
    fclose(fp);
Run Code Online (Sandbox Code Playgroud)

结果不依赖于调用顺序(即,首先调用fscanf_s,首先获取空字符串).编译VC++ - VS2005.有人可以复制吗?谁能解释一下?

谢谢!

c++ visual-studio-2005 crt visual-c++

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

序列点 - 这个 gcc 警告是一个错误吗?

拿这个玩具程序:

int main() 
{
  int a = 1;
  a = ++a ;
}
Run Code Online (Sandbox Code Playgroud)

在 gcc 9.3(甚至主干)下编译-Wall -std=c++17输出:

<source>:4:5: warning: operation on 'a' may be undefined [-Wsequence-point]
    4 |   a = ++a ;
      |   ~~^~~~~
Run Code Online (Sandbox Code Playgroud)

我知道在过去这确实是一个问题,但是对同一 SO 问题不同答案指向 C++17 标准的一部分,该标准已修复以表明在赋值操作中,rhs 在实际任务:

8.18. ... 在所有情况下,赋值顺序在左右操作数的值计算之后,赋值表达式的值计算之前。

那么这个警告确实是假的还是我遗漏了什么?

c++ language-lawyer c++17

7
推荐指数
2
解决办法
193
查看次数

模拟USB输入

我们的产品包括一些定制硬件,通过 USB 连接到 PC。我们已经开始研究自动测试,但到目前为止我无法找到可以记录/重放通用 USB 输入的工具。

有谁知道这样的工具吗?
(而且 - 如果它能以某种方式编写脚本那就最好了 - 测试必须在 GUI 交互自定义硬件操作之间交替)

testing usb mocking

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

gcc 中的零初始化与 clang 中的默认初始化?

我在值初始化对象时遇到了 gcc 和 clang 之间意想不到的差异,并怀疑存在一个(或两个)错误。

  1. 设置1:
struct A {
    A() {}
    int x;
};

struct B : A {
    int y;
};

int main() {
...
 B b {};  // How should b.x be initialized?
...
}
Run Code Online (Sandbox Code Playgroud)

gcc 使B b2 {}A 为零初始化,clang 使其默认初始化(不触及 x): https: //godbolt.org/z/8znhr41ro

现在我们要深入探讨标准,以了解谁是对的。值初始化子句

9 对 T 类型的对象进行值初始化意味着:

(9.1) 如果 T 是一个(可能是 cv 限定的)类类型 ([class]),那么

(9.1.1) 如果 T 没有默认构造函数 ([class.default.ctor]) 或者用户提供或删除的默认构造函数,则该对象被默认初始化;

(9.1.2) 否则,该对象被零初始化,并且检查默认初始化的语义约束,并且如果 T 具有非平凡的默认构造函数,则该对象被默认初始化;

(9.2) 如果 T 是数组类型,则每个元素都是值初始化的;

(9.3) 否则,该对象被零初始化。

虽然 9.1.2 …

c++ gcc clang language-lawyer

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