使用带有标志的gcc-7.1进行编译时-std=c++17,以下程序会引发错误:
#include <string_view>
void foo(const char* cstr) {}
void bar(std::string_view str){
foo(str);
}
Run Code Online (Sandbox Code Playgroud)
错误消息是
In function 'void bar(std::string_view)':
error: cannot convert 'std::string_view {aka std::basic_string_view<char>}' to 'const char*' for argument '1' to 'void foo(const char*)'
foo(str);
Run Code Online (Sandbox Code Playgroud)
我很惊讶没有转换,const char*因为其他库(abseil,bde)提供了string_view隐式转换为的类似类const char*.
除了Visual Studio之外,您最好创建,编辑,维护和调试XSLT文件的工具是什么?
我在一个相当大的项目上工作,我们有大量的XSLT文件,并且它们的实现变得非常复杂.
这种语言似乎很脆弱.能够更快地导航和识别错误会很好.
我想同步两个目录.我使用file_get_contents($ source)=== file_get_contents($ dest)来比较两个文件.这样做有什么问题吗?
我一直在努力让Visual C++工作,但是在构建每个项目时我都遇到了这个错误:"这个项目已经过时了""你想构建它吗?" 它每次都无法建立.
当我重建时,构建仍然失败,虽然在记录器中我没有注意到任何错误消息,这使我认为它没有正确记录(我正在使用第三方程序进行记录).
我在这里遵循了一些说明:http://blogs.msdn.com/b/vsproject/archive/2009/07/21/enable-c-project-system-logging.aspx并启用了日志记录.
我收到此错误:项目不是最新的,因为"在此处插入文件名".lastbuildstate缺失.请注意,在实际的visual studio中,没有任何记录.我无法在谷歌上找到任何相关内容.可能是我错误地启用了日志记录,但我觉得这是错误.
以下用户定义的文字省略了错误:
constexpr double operator "" _kg(double q)
{
return q*1000;
}
Run Code Online (Sandbox Code Playgroud)
但如果long添加,错误将消失,代码将按如下方式工作:
constexpr double operator "" _kg(long double q)
{
return q*1000;
}
Run Code Online (Sandbox Code Playgroud)
错误是:
‘constexpr double operator""_kg(double)’ has invalid argument list
Run Code Online (Sandbox Code Playgroud)
这个问题只能由参数和返回类型可以是引起double不long.
为什么long需要?
请考虑以下代码段:
struct v : std::variant<int, std::vector<v>> { };
int main()
{
std::visit([](auto){ }, v{0});
}
Run Code Online (Sandbox Code Playgroud)
clang ++ 7用-stdlib=libc++ -std=c++2a编译代码;
g ++ 9 -std=c++2a无法编译代码,出现以下错误:
/opt/compiler-explorer/gcc-trunk-20180711/include/c++/9.0.0/variant:94:29:错误:嵌套名称说明符中使用的不完整类型'std :: variant_size'
Run Code Online (Sandbox Code Playgroud)inline constexpr size_t variant_size_v = variant_size<_Variant>::value; ^~~~~~~~~~~~~~
两种实现都符合标准吗?
如果没有,这里的实施是正确的,为什么?
我在这里检查了abs和fabspython 之间的区别
据我所知,速度和传递的类型有一些不同,但我的问题与VS上的原生c ++有关
关于VS我尝试了以下内容Visual Studio 2013 (v120):
float f1= abs(-9.2); // f = 9.2
float f2= fabs(-9); // Compile error [*]
Run Code Online (Sandbox Code Playgroud)
所以fabs(-9)它会给我一个编译器错误,但是当我尝试执行以下操作时:
double i = -9;
float f2= fabs(i); // This will work fine
Run Code Online (Sandbox Code Playgroud)
我从第一个代码中理解它不会编译因为fabs(-9)需要一个double,并且编译器无法将-9转换为-9.0,但在第二个代码中编译器将在编译时转换i=-9为i=-9.0所以fabs(i)将正常工作.
有更好的解释吗?
另一件事,为什么编译器不能fabs(-9)像在c#中那样自动接受 并将int值转换为double?
[*]:
Error: more than one instance of overloaded function "fabs" matches the argument list:
function "fabs(double _X)"
function "fabs(float _X)"
function …Run Code Online (Sandbox Code Playgroud) 我特别想知道以下情况(我在一些代码中发现了我必须使用的情况):
SomeClass *ar = new SomeClass[2];
ar++;
delete[] ar;
Run Code Online (Sandbox Code Playgroud)
这段代码似乎运行正常 - 即没有崩溃(win32,使用VS2005构建).
这是"合法的"吗?当然感觉不对.
以下肯定有效,但非常繁琐:
T(const T&) = delete;
T(T&&) = delete;
T& operator=(const T&) = delete;
T& operator=(T&&) = delete;
Run Code Online (Sandbox Code Playgroud)
我正试图发现最简洁的方式.以下工作会吗?
T& operator=(T) = delete;
Run Code Online (Sandbox Code Playgroud)
更新
请注意,我选择T& operator=(T)而不是T& operator=(const T&)或T& operator=(T&&),因为它可以同时满足两个目的.
class P
{
};
template< typename P >
class C : public P
{
public:
void f()
{
P::f();
}
};
int main() {
C<P> c1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为了防止我的问题留下任何误解的空间,这是一个代码示例.如果C是没有模板,但是从继承P直接,那么样品将无法编译,因为明确的功能f()试图呼吁基类的功能P是不存在的.
但是如果C是模板化的话,那么只有在f()实际调用时才会被拾取.
我想知道为什么会有这种差异.在这两种情况下f()都是死代码并且无论如何都会被剥离,但程序在非模板场景中是不正确的.