我一直在尝试了解 std::bind 的工作原理。因此,我们要尝试不同的例子。下面是我无法理解其输出的示例程序。
版本1
class NAME
{
public:
void f()
{
std::cout<<"f"<<std::endl;
}
NAME()
{
std::cout<<"default constructor"<<std::endl;
}
NAME(const NAME&)
{
std::cout<<"copy constructor"<<std::endl;
}
};
int main()
{
std::cout << "Hello World" << std::endl;
NAME n;
std::function<void ()> callable = std::bind(&NAME::f, n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上述版本1的输出如下:
Hello World
default constructor
copy constructor
copy constructor
Run Code Online (Sandbox Code Playgroud)
我知道传递的参数将被复制,因此复制构造函数应该只被调用一次,但在上面的输出中复制构造函数被调用两次。为什么/怎么会发生这种情况?是否因为使用 std::bind 创建的新可调用对象将用于在 lhs 上使用 std::function 初始化另一个可调用对象?
版本2
int main()
{
std::cout << "Hello World" << std::endl;
NAME n;
std::function<void ()> callable = std::move(std::bind(&NAME::f, n));
return …Run Code Online (Sandbox Code Playgroud) 我想知道如果我们有一个函数参数是对函数的引用,会发生什么,const如下所示。
版本1
int anotherFunc()
{
std::cout<<"inside anotherFunc"<<std::endl;
return 5;
}
void func(decltype(anotherFunc) const &someFunction)//note the const here
{
std::cout<<"inside func"<<std::endl;
std::cout<<someFunction()<<std::endl;
}
int main()
{
std::cout << "Hello World" << std::endl;
func(anotherFunc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
版本2
int anotherFunc()
{
std::cout<<"inside anotherFunc"<<std::endl;
return 5;
}
void func(decltype(anotherFunc) &someFunction)//note the missing const here
{
std::cout<<"inside func"<<std::endl;
std::cout<<someFunction()<<std::endl;
}
int main()
{
std::cout << "Hello World" << std::endl;
func(anotherFunc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
someFunction版本1和版本2在函数的函数参数方面是否完全等效func?也就是说,const为函数参数添加someFunction什么都不做(即简单地忽略)。 …void我正在学习 C++ 中的模板,并遇到了一个使用强制转换的示例:
template<typename T>
auto func (T const& t) -> decltype( (void)(t.size()), T::size_type() )
{
return t.size();
}
Run Code Online (Sandbox Code Playgroud)
解释中写道:
将表达式强制转换为 void 是为了避免用户定义的逗号运算符针对表达式类型重载的可能性。
我的问题是:
如何使用强制转换为 void 来“避免用户定义的逗号运算符重载表达式类型的可能性”?我的意思是,任何人都可以举出任何例子,如果我们不使用void此代码会给出错误吗?例如,假设我们有一个名为 的类SomeClass,它重载了逗号运算符。现在,如果我们不使用,这会成为问题吗void?
static_cast在这种情况下可以使用 C 风格的强制转换吗?例如,类似的东西static_cast<void>(t.size())。我正在阅读使用 C++17 功能的示例,因此我想知道为什么作者在这种情况下使用了 C 风格转换。
我读过强制转换为“void”到底有什么作用?,从中我得到的印象是,如果我们使用(void)xthen 这意味着抑制编译器警告,并且还意味着“忽略 x 的值”。但后来我无法理解表达式x和之间的区别(void)x。
我正在学习 C++ 中的引用。特别是,我了解到引用不是实际对象。相反,它们引用了其他一些对象。也就是说,引用只是其他对象的别名。
然后我发现了这个,上面写着:
重要提示:尽管引用通常是使用底层汇编语言中的地址来实现的,但请不要将引用视为指向对象的滑稽指针。引用就是对象,只是有另一个名称。它既不是指向对象的指针,也不是对象的副本。它是物体。没有任何 C++ 语法可以让您独立于引用的对象对引用本身进行操作。
我知道上面的引用意味着我们不能将引用本身与它引用的对象分开进行操作,但它似乎仍然暗示“引用是一个对象”。
另外,我遇到过下面给出的句子:
在 ISO C++ 中,引用不是对象。因此,它不需要任何内存表示。
我没有第二条引文的链接,但我在某处的一篇帖子中读到了它。
我的问题是,假设第二个引用也来自标准(可能并非如此),这两个引用的陈述是否相互矛盾。或者至少第一句话是有误导性的。哪一个是正确的。
我目前的理解(通过阅读《C++ Primer 5th Edition》等书籍)是引用是对象的别名。这让我想到它们不应该占用内存中的任何空间。
我读到我们不应该返回局部变量的指针或引用。因此,在下面给出的示例中,我知道当我编写:return i;inside function时foo,我返回对局部变量的引用。在函数外部使用该引用将导致未定义的行为。
#include <iostream>
const int& foo()
{
int i = 5;
return i;//returning reference to a local variable
}
const int& func()
{
return 5;
}
int main()
{
const int& ref = func();
const int& f = foo();
std::cout<<f<<std::endl; //I know this is undefined behavior because we're using a reference that points to a local variable
std::cout<<ref; //But IS THIS UNDEFINED BEHAVIOR too?
}
Run Code Online (Sandbox Code Playgroud)
return 5;我的问题是,对于function 内部的return 语句是否同样适用func。我知道在 C++17 中存在强制复制 …
我最近了解到,构造函数在 C++ 中没有名称以及有关它们的其他一些信息。我还知道函数在 C++ 中有一种称为函数类型的类型。例如,
void func(int)
{
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中, 的函数类型func为。 void (int)
现在,我想知道,由于构造函数是特殊的成员函数,那么它们是否也具有如上所示的类型。例如说我们有:
struct Name
{
Name(int)
{
}
};
Run Code Online (Sandbox Code Playgroud)
上面所示的构造函数是否也像普通函数或普通成员函数一样具有函数类型。如果是,那么我们如何找到该类型。就像我们可以decltype在普通函数上使用一样,是否允许decltype在构造函数上使用来查找它们的类型。
我注意到下面示例中的使用std::map::reverse_iterator不适用于 C++20,但适用于所有编译器中的 C++17。
#include <map>
class C; //incomplete type
class Something
{
//THIS WORKS IN C++17 as well as C++20 in all compilers
std::map<int, C>::iterator obj1;
//THIS DOESN'T WORK in C++20 in all compilers but works in C++17 in all compilers
std::map<int, C>::reverse_iterator obj2;
};
int main()
{
Something s;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是so(such)发生了什么变化,导致所有编译器中的C++20使用停止工作。std::map::reverse_iteratorC++20
我的函数 mutateSequence 接受三个参数。参数p是0和1之间的值,包括0和1。我需要两个 if 语句,一个以 4p/5 的概率输入,另一个以 p/5 的概率输入。我该如何编写逻辑来实现这一点?
代码:
void mutateSequence(vector<pair<string, string>> v, int k, double p)
{
for (int i = 0; i < k - 1; i++)
{
string subjectSequence = v[i].second;
for (int j = 0; j < subjectSequence.length(); j++)
{
// with probability 4p/5 replace the nucelotide randomly
if (//enter with probability of 4p/5)
{
//do something
}
if (//enter with probability of p/5)
{
//do something
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我期望第一个 if 语句以 4p/5 …
我了解到,X对于具有名为 的成员函数的类func,C++ 标准不允许我们编写decltype(X::func). 因此,我预计下面给出的程序会产生类似 的错误invalid use of non-static member function。但令我惊讶的是,该程序可以使用所有 3 个编译器进行编译。
#include <iostream>
#include <type_traits>
#include <concepts>
template < typename T >
concept test = std::same_as <decltype(T::func), int(int) >;
struct D
{
int func(int);
};
int main()
{
std::cout << test<D>;
}
Run Code Online (Sandbox Code Playgroud)
上述程序由所有 3 个编译器编译。通过查看 [expr.prim.id],程序似乎格式不正确,并且应该发出诊断信息。但没有一个编译器提供任何错误。那么,以程序中所示的方式使用conceptin 是否会使程序格式良好,或者仍然格式错误,并且所有编译器都错误吗?