小编Sar*_*ien的帖子

"ODR使用"是什么意思?

这只是出现在另一个问题的背景下.

显然,类模板中的成员函数只有在使用ODR时才会被实例化.有人可以解释一下究竟是什么意思.关于单一定义规则(ODR)维基百科文章未提及" ODR使用 ".

但是标准将其定义为

名称显示为潜在评估表达式的变量是odr-used,除非它是满足出现在常量表达式(5.19)中的要求的对象,并且立即应用左值到右值转换(4.1).

在[basic.def.odr]中.

编辑:显然这是错误的部分,整个段落包含不同事物的多个定义.这可能是类模板成员函数的相关内容:

一个非重载函数,其名称显示为可能已评估的表达式或一组候选函数的成员,如果从可能已评估的表达式引用时通过重载决策选择,则使用该函数,除非它是纯虚拟的函数及其名称未明确限定.

但我不明白,这个规则如何在多个编译单元中工作?如果我显式实例化一个类模板,是否所有成员函数都被实例化了?

c++ templates one-definition-rule

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

为什么在此示例中模板参数的顺序对MS C++编译器很重要?

以下代码在GCC中编译良好,但在Visual Studio中导致

错误C2782:' bool contains(const T &,const std::initializer_list<T2> &)':模板参数' T'含糊不清,请参阅' contains'可能const wchar_t *'或' std::wstring'的声明

但是,如果给出模板参数的顺序,它确实可以编译和工作

template<typename T2, typename T>

这是编译器错误吗?

#include <string>
#include <iostream>
#include <set>
#include <initializer_list>
#include <algorithm>

template<typename T, typename T2>
bool contains(T const& value, std::initializer_list<T2> const& set)
{
  return std::find(std::begin(set), std::end(set), value) != std::end(set);
}

int main(void)
{
  std::set<std::wstring> values = { L"bar", L"not" };

  for (std::wstring val : values) {
    std::wcout << "\"" << val << "\" ";
    if …
Run Code Online (Sandbox Code Playgroud)

c++ templates visual-c++ c++11

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

为什么C宏不是类型安全的?

如果遇到了这种说法 时间并不能弄清楚什么是应该的意思.由于生成的代码是使用常规C编译器编译的,因此最终会像任何其他代码一样(或很少)检查类型.

那么为什么宏不安全呢?这似乎是他们应被视为邪恶的主要原因之一.

c c++ macros types

22
推荐指数
3
解决办法
6948
查看次数

如何在不修剪的情况下使用DrawString?

我发现DrawString函数切断整个字符或单词的方式是违反直觉的.显示文本的一部分清楚地表明缺少某些东西.

这里有些例子:

StringTrimming.None: 在此输入图像描述

StringTrimming.Character: 在此输入图像描述

我想要的是: 在此输入图像描述 (GIMP模型)

StringTrimming.None和StringTrimming.Character一样吗?在我的案例中,他们似乎表现得完全相同.有什么我可以忽略或这是一个已知的"功能"?

根据文档 StringTrimming.None"指定不修剪".

使用Java创建的示例的此站点甚至显示"无"以修剪比"字符"更多的字符.

还有其他技巧可以达到这个效果吗?

注意:我不想显示"......"或类似内容.我发现这是浪费空间,但这可能是对UX的讨论.

c# winforms

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

apache模块与cgi(关于安全性)之间有区别吗?

例如,它是更安全的使用mod_php,而不是php-cgi?或者使用它mod_perl而不是传统更安全cgi-scripts

我主要对安全问题感兴趣,但如果存在显着差异,速度可能会成为一个问题.

php apache perl mod-perl mod-php

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

在初始化参考时何时以及为什么要获得副本?

有些情况下,我想要一个对象的引用,但我得到一个副本.这是一个例子:

  std::pair<const std::string, int> foo("hello", 5);
  const std::pair<std::string, int> & bar = foo;

  std::cout << "foo: " << foo.first << " " << foo.second << std::endl;
  std::cout << "bar: " << bar.first << " " << bar.second << std::endl;
  foo.second = 7;
  std::cout << "foo: " << foo.first << " " << foo.second << std::endl;
  std::cout << "bar: " << bar.first << " " << bar.second << std::endl;
Run Code Online (Sandbox Code Playgroud)

这会产生:

foo: hello 5
bar: hello 5
foo: hello 7
bar: hello …
Run Code Online (Sandbox Code Playgroud)

c++ reference

13
推荐指数
2
解决办法
598
查看次数

如何将字符串转换为字符列表?

由于字符串支持迭代但不支持索引,我想将字符串转换为字符列表.我有"abc",我想要['a', 'b', 'c'].

它可以是任何类型,只要我可以索引它.A Vec<char>或者[char; 3]没关系,其他想法也很有意思!

因为我处理很长的字符串,所以会更快.假设字符串是ASCII时效率更高的版本也很酷.

rust

11
推荐指数
2
解决办法
7233
查看次数

为什么函数参数中的const限定符用于重载分辨率?

可能重复:
具有const参数和重载的函数

我对overloading和const声明规则感到困惑.这有两件事让我感到困惑,也许你可以帮助我找到更深层次的误解,导致他们对我感到困惑.;)

首要问题:

我的编译器允许这样:

void f(int & x) {
  std::cout << "plain f" << std::endl;
}
void f(const int & x) {
  std::cout << "const f" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但是以下导致编译错误(函数已经有一个主体):

void f(int x) {
  std::cout << "plain f" << std::endl;
}
void f(const int x) {
  std::cout << "const f" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我认为这是有道理的,因为我认为const只是告诉编译器传递的对象没有改变,在第二种情况下它仍然被复制.但如果这是正确的,为什么我可以使用const重载函数?

换句话说,为什么我使用编译版本并调用这样的函数:

  int x1 = 5;
  const int x2 = 5;
  f(x1);
  f(x2);
Run Code Online (Sandbox Code Playgroud)

我得到"普通f"和"const f"而不是"const f"两次?显然现在我也使用const来告诉编译器调用哪个函数不仅仅是引用没有改变.这变得更加混乱,因为如果我删除"普通"版本它工作得很好并且两次调用"const"版本.

现在我的实际问题是什么?我想知道这种行为背后的想法是什么,因为否则记住它是非常困难的.

c++ overloading overload-resolution

10
推荐指数
2
解决办法
1997
查看次数

我在哪里可以找到操作的复杂性?

这个答案中提到,对于一个字符串来说 s.chars().count(),获取字符数是一个O(n)操作.对于简单的ASCII字符串,也可以使用函数获取字节数s.len().当使用检查以确保所有这些字节实际上是ASCII时,这可能是安全的.

我想知道该操作的复杂程度.它可能仍然必须像在C中一样找到字符串的结尾并且是O(n).

我试图查找它并找到适用的文档std::string::Strings.然而,它并未说明其复杂性.看看它的来源就是这样做的self.vec.len().所以我们去看看矢量文档,发现这只是返回一个存储长度self.len,这意味着这确实是一个O(1)操作.

那是很多工作.现在来谈谈,此案s是一个的std ::海峡?我试图做同样的事情,但陷入了困境.

Rust中的操作复杂性是否有更容易访问的资源?

Python这个列表的东西会很棒.

rust

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

如何编写适当的析构函数和终结符?

我试图弄清楚如何在C++/CLI中正确清理我的对象之后.

我已经阅读或浏览了这两篇文章(,)并查看了标准并查看了其他一些问题,特别是这一个问题.

我有各种各样的信息:

  1. 终结器应该清理非托管资源(因此当对象被垃圾收集时,所有内容都会被清除.
  2. 析构函数应该清理托管资源(删除Foo或Foo.Dispose()?)并调用终结器(根据1)
  3. 既析构函数和终结器可以被多次调用(参见3的8.8.8第26页端)
  4. 如果调用析构函数,则不再调用终结器(根据1)(不是通过CLR,也就是说,您仍然可以自己调用它)
  5. 析构函数将调用基类析构函数(参见第3页,第25页)
  6. 具有终结器的类应始终具有析构函数(可能是为了确定性地清理非托管资源)
  7. 对终结器的调用不会调用基类终结器(3 19.13.2,第131页)

但也有很多混乱,部分是由于这一事实造成的

  1. 终结器在C#中称为析构函数
  2. 析构函数在内部生成Dispose和Finalize方法(不确定Finalize),但Finalize方法不是终结器
  3. 析构函数的语义在C++中是不同的,并且通常具有确定性清理和垃圾收集的复杂性

我想要的答案是一个类的例子,它包含它可能包含的所有不同类型的数据(托管,非托管,托管但是一次性的,你能想到的其他任何东西)和正确编写的析构函数和终结器.

我有两个更具体的问题:

  1. 通过只有一个bool hasBeenCleanedUp成员处理多次被调用的可能性并使析构函数/终结器中的整个代码以此为条件,是否可以接受?
  2. 什么样的数据只能由析构函数清理,但不能在终结器中清理,因为它可能已经被gc清理了?

destructor c++-cli finalizer

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