为什么允许在C++中编译以下内容?
#include<iostream>
using namespace std;
class mytest
{
public:
operator int()
{
return 10;
}
operator const int()
{
return 5;
}
};
int main()
{
mytest mt;
//int x = mt; //ERROR ambigious
//const int x = mt; //ERROR ambigious
}
Run Code Online (Sandbox Code Playgroud)
为什么允许转换运算符的不同版本(基于constness)在它们的使用总是导致歧义时进行编译是有意义的?
有人可以澄清我在这里缺少的东西吗?
标量类型定义为
Trait类,用于标识T是否为标量类型.标量类型是一种类型,它具有加法运算符的内置功能而没有重载(算术,指针,成员指针,枚举和std :: nullptr_t).
它继承自integral_constant为true_type或false_type,具体取决于T是否为标量类型,无论其const和/或波动限定.
它表示指针是标量类型.
现在,如果我们去定义文字类型:
类型是文字类型,如果它是:
- 标量类型; 要么
- 参考类型; 要么
- 一个文字类型的数组; 或-a类类型(第9节)具有以下所有属性:
- 它有一个简单的析构函数,
- 非静态数据成员(如果有)的brace-or-equal-initializers中的每个构造函数调用和完全表达式都是一个常量表达式(5.19),
- 它是一个聚合类型(8.5.1)或者至少有一个constexpr构造函数或构造函数模板,它不是复制或移动构造函数,并且
- 它的所有非静态数据成员和基类都是文字类型.
现在,结合上面两个语句,它意味着指针是文字类型.但是指针不能是constexpr.请有人澄清一下吗?
进一步看下面的代码:
int a = 7;
constexpr int *pointer1 = &a;
int main ()
{
int b = 4;
constexpr int *pointer2 = &b;
}
Run Code Online (Sandbox Code Playgroud)
pointer1很好,但指针2给出错误.这是否意味着指向全局的指针很好但是自动变量不是?标准在任何地方都提到了吗
在c ++ 20中提出,一些算法是constexpr.
例如:
template< class InputIt, class UnaryPredicate >
bool all_of( InputIt first, InputIt last, UnaryPredicate p );
(since C++11)
(until C++20)
template< class InputIt, class UnaryPredicate >
constexpr bool all_of( InputIt first, InputIt last, UnaryPredicate p );
(since C++20)
Run Code Online (Sandbox Code Playgroud)
虽然我们知道迭代器通常不是constexpr.我认为这只适用于constexpr容器.有人可以澄清我是否遗漏了某些内容以及我的理解是否正确?
我有一个堆使用std::make_heap:
std::vector<int> v{1,2,3,5,9,20,3};
std::make_heap(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)
现在我通过更改一个随机元素来更新堆:
v[3] = 35;
Run Code Online (Sandbox Code Playgroud)
是否有标准库的方式,才能把再次调整堆O(log n)时间,其中n是容器的大小。基本上我正在寻找 heapify 功能。我知道改变了什么元素。
我明白std::make_heap是O(n log n)时候了。我也遇到了重复的问题,但这在某种意义上是不同的,因为它正在改变最大元素。因为该解决方案已经给出了O(log n)该问题的复杂性。
我正在尝试更改堆中的任何随机元素。
所以我在某个地方遇到了这个问题:
情况1:
int a;
a = 1, 2, 3;
printf("%d", a);
Run Code Online (Sandbox Code Playgroud)
案例2:
int a = 1, 2, 3;
printf("%d", a);
Run Code Online (Sandbox Code Playgroud)
解释说:
第二种情况给出错误,因为逗号用作分隔符,在第一种情况下=优先于,它,所以它基本上是(a=1), 2, 3;
但我想问为什么在案例2 中=没有优先权,?
constexpr 函数定义为 (c++14)
constexpr 函数必须满足以下要求:
- 它不能是虚拟的
- 它的返回类型必须是 LiteralType 它的每个参数都必须是 LiteralType
- 至少存在一组参数值,使得函数的调用可以是核心常量表达式的计算子表达式(对于构造函数,在常量初始值设定项中使用就足够了)(C++14 起)。违反此项目符号无需进行诊断。
函数体必须被删除或默认,或者包含除以下之外的任何语句:
- asm 声明
- goto 语句
- 带有除 case 和 default 之外的标签的语句
- try 块
- 非文字类型变量的定义
- 静态或线程存储持续时间的变量的定义
- 未执行初始化的变量的定义。
现在下面的 func1 满足要求并编译
constexpr int * func1 (int a)
{
int b = 4;
return &b;
}
int main()
{
constexpr int * a = func1(3);
int arr[*a];
std::cout << a << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是为什么 func1 是 constexpr。它如何在编译时知道局部变量的地址?
我正在使用 gcc 6.4.0
因为这是有道理的,lower_bound并且因为元素没有顺序upper_bound而缺席std::unordered_map。
但是std::unordered_map有方法equal_range。它返回对应于键的范围的迭代器。
它有什么意义?由于只能有一个带有键的元素std::unordered_map。这只是find方法。
另外,在中std::unordered_multimap,它的存在是否意味着在unordered_multimap使用迭代器进行迭代时,具有相同键的所有元素将始终在一起?
考虑下面崩溃的简单代码:
#include <iostream>
struct test
{
int *x;
test(){ x = new int;}
~test(){delete x;}
};
int main() {
test x;
test y = std::move(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当对象的资源被移动时std::move,当它的析构函数被调用为超出范围的自然对象时会发生什么?这是否意味着我们不应该std::move在堆栈上调用对象?
std::less当它只调用<运算符时,为什么需要(和等效的其他函数对象),我们可以反过来运算符?
可能的答案有问题:
但是我并不完全相信(特别是关于弱排序).有人可以解释一下吗?
我有一个std::map.我想迭代它并使用结果作为函数的参数.编译似乎抱怨我的对象是左值,但我无法弄清楚为什么它被认为是左值.
void my_function(std::pair<std::string, std::string>& my_arg){
//do stuff, modify elements from the pair
}
std::map<std::string, std::string> my_map;
// fill the map with values...
for(auto& element : my_map){
my_function(element);
}
Run Code Online (Sandbox Code Playgroud)
我可能会使用迭代器来解决这个问题,但我想学习如何用c ++ 11方法来解决这个问题.
以下是cppreference的定义:
[ https://en.cppreference.com/w/cpp/named_req/CopyConstructible][1]
要求:类型T满足CopyConstructible if
类型T满足MoveConstructible和Given
v,类型为T或const T的左值表达式或类型为const T u的rvalue表达式,任意标识符以下表达式必须有效且具有指定的效果
表达式后置条件T u = v; u的值等于v的值.v的值不变
T(v)T(v)的值等于v的值.v的值不变.
我的问题是以下几行:
v,类型为T或const T的左值表达式或类型为const T的右值表达式
我不理解这个"const T型的rvalue表达式"的一部分?为什么这个"类型为const T的rvalue表达式"在CopyConstructible的定义中是什么?有人可以用例子解释一下吗?MoveConstructible的定义(这是CopyConstructible的先决条件)已经包含了这个要求,不是吗?