struct some_struct
{
std::list<some_struct> nested;
};
Run Code Online (Sandbox Code Playgroud)
IIUC过去会调用UB,因为标准容器只需要用完整类型进行实例化.
但是,现在我们已经从这里取得了进展,根据http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4510.html我们可以实例化std::list
,std::forward_list
并且std::vector
类型不完整,所以上面的代码已验证.
但是,但是,我可以进一步写下来:
struct some_struct
{
std::list<some_struct>::iterator it;
};
Run Code Online (Sandbox Code Playgroud)
?
实例化容器并使用其成员类型是不一样的......例如,我被告知我可以实例化具有不完整类型的boost容器,但value_type
除非模板参数是完整类型,否则我可能不会使用它们.所以我不确定上面的代码片段是否有效.
是吗?
cppreference.com(http://en.cppreference.com/w/cpp/types/enable_if#Notes)指出:
一个常见的错误是声明两个仅在默认模板参数上有所不同的函数模板.这是非法的,因为默认模板参数不是函数模板签名的一部分,并且声明具有相同签名的两个不同函数模板是非法的.
Run Code Online (Sandbox Code Playgroud)struct T { enum { int_t,float_t } m_type; template <typename Integer, typename = std::enable_if_t<std::is_integral<Integer>::value> > T(Integer) : m_type(int_t) {} template <typename Floating, typename = std::enable_if_t<std::is_floating_point<Floating>::value> > T(Floating) : m_type(float_t) {} // error: cannot overload };
那么真实......那么解决这个问题并实际实现上述错误代码无法实现的正确方法是什么?
这是从服务器发送到客户端的内容:
public class BattleHub : Hub
{
public override async Task OnConnectedAsync()
{
await Clients.Client(Context.ConnectionId).SendAsync("ConfigurationInfo",
new Dictionary<string, string> { { "WtF", "WtF" } });
await base.OnConnectedAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
这是客户收到的:
{"wtF":"WtF"}
Run Code Online (Sandbox Code Playgroud)
如以下客户代码所示:
const battle_connection = new signalR.HubConnectionBuilder().withUrl("/battlehub").build()
battle_connection.on("ConfigurationInfo", (bigDict) => {
window.alert(JSON.stringify(bigDict))
})
Run Code Online (Sandbox Code Playgroud)
注意到字典键的第一个字母的大小写有所变化吗?应该发送“ WtF”,但是发送“ wtF”。
为什么会这样?有什么办法可以防止呢?
奇怪的是,这仅发生在字典键上:如您所见,值保持不变。同样仅发送单个字符串,而不包装在字典中,不会导致首字母变为小写。一种List<string>
也被正确发送。
所有键的所有字母的大小写在这里实际上都是有意义的,因此,如果将其中任何一个强制转换为小写,则会使应用程序出错!当然,尽管我们可以想到解决该问题的或多或少的丑陋方法,但是有什么方法可以在SignalR串行器中关闭此转换?
ASP .NET Core 2.1
dictionary case-sensitive lowercase asp.net-core-2.0 asp.net-core-signalr
我的大学课程要求一些基本的组装知识……即使我没有任何知识。但是他们给了我们这个示例汇编代码:
080485fa <check_pin>:
80485fa: 55 push ebp
80485fb: 89 e5 mov ebp,esp
80485fd: 81 7d 08 bf 07 00 00 cmp DWORD PTR [ebp+0x8],0x7bf
8048604: 0f 94 c0 sete al
8048607: 0f b6 c0 movzx eax,al
804860a: 5d pop ebp
804860b: c3 ret
Run Code Online (Sandbox Code Playgroud)
它应该或多或少地等同于以下C代码:
int check_pin(int pin) {
return pin == 0x7bf;
}
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚这个汇编代码到底是做什么的,而我对此sete
指令却傻眼了。这条指令做什么?
Wikibooks提供了一门有关x86汇编的课程,但是sete
在致力于汇编指令的这一章中,我找不到任何内容。
为什么要编译此代码?
--sequence_mine :: Monad m => [m a] -> m [a]
sequence_mine [] = return []
sequence_mine (elt:l) = do
e <- elt
sl <- sequence l
return (e:sl)
Run Code Online (Sandbox Code Playgroud)
注意我在这里特意注释掉了类型声明。但是即使没有类型声明,代码仍然可以编译并且可以按预期工作-这让我感到惊讶。
据我了解,在这方面应该产生歧义:
return (e:sl)
Run Code Online (Sandbox Code Playgroud)
原因是Haskell不应该知道我们要返回哪种类型的monad。为什么它必须与我们接受的类型相同?
要澄清更多。据我了解,如果我不明确地将类型声明与我注释过的类型声明类似,Haskell应该推断该函数具有如下类型:
sequence_mine :: (Monad m1, Monad m2) => [m1 a] -> m2 [a]
Run Code Online (Sandbox Code Playgroud)
除非我明确地统一起来m1
并m2
通过将它们两者都调用m
,否则Haskell没有理由相信它们都引用相同的类型!我想。
但是事实并非如此。我在这里想念什么?
有人可以向我解释为什么在地球上这个代码片段拒绝工作?
#include <cassert>
#include <type_traits>
using namespace std;
int main()
{
assert(is_same<int, int>::value);
}
Run Code Online (Sandbox Code Playgroud)
编译失败,因为根据编译器:
prog.cpp:7:33: error: macro "assert" passed 2 arguments, but takes just 1
assert(is_same<int, int>::value);
^
prog.cpp: In function 'int main()':
prog.cpp:7:2: error: 'assert' was not declared in this scope
assert(is_same<int, int>::value);
^
Run Code Online (Sandbox Code Playgroud)
什么?is_same<int, int>::value
毫无疑问是一个论点.同样assert
是在这个范围内声明的,编译器本身证实,在以前的错误!
是否byte
转换为ulong
?
看起来似乎如此.这不会抛出:
byte wtf = HttpContext.Connection.RemoteIpAddress.GetAddressBytes()[0];
ulong ffs = (ulong)wtf;
Run Code Online (Sandbox Code Playgroud)
好的,让我们尝试将整个数组转换为:
ulong[] ip = HttpContext.Connection.RemoteIpAddress.GetAddressBytes().Cast<ulong>().ToArray();
Run Code Online (Sandbox Code Playgroud)
这引发了!?
System.InvalidCastException:'无法将'System.Byte'类型的对象强制转换为'System.UInt64'.'
嗯?解释器先生,当我要求你为变量执行此操作时,你怎么可能能够施展System.Byte
,System.UInt64
但当我要求你wtf
立刻为整个阵列做这个时,你会抱怨?
说实话,这里发生了什么?我已经困了,想念一些简单的东西吗?有人可以向我解释这个吗?
#include <iostream>
using namespace std;
int main() {
int i = 0;
if(true) {
int i = 5;
cout << i << '\n';
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
尝试在Ideone上运行上面的代码,看看它是否合法.结果让我感到困惑:
正如您从我的链接中看到的,每次在Ideone上编译时,相同的代码行为都完全不同!这闻起来像未定义的行为(UB).
OK C++因其不直观的行为而闻名但是! - 我承认它只是我的直觉,但我不希望C++在内部范围UB中重新声明一个变量!Id期望阴影或强制编译错误.
根据C++标准,我的代码真的是UB,还是只是Ideone和/或gcc的特性?如果它是UB,是UB,因为我重新申报i
或出于其他原因我现在没有注意到?
我正在阅读http://learnyouahaskell.com/ ...令我惊讶的是:
因此,
main
始终具有类型签名main :: IO something
,其中something
是一些具体类型。
?因此main
,不必一定是type IO()
,而可以是IO(String)
or IO(Int)
吗?但是,这有什么用?
我玩了一些
m@m-X555LJ:~$ cat wtf.hs
main :: IO Int
main = fmap (read :: String -> Int) getLine
m@m-X555LJ:~$ runhaskell wtf.hs
1
m@m-X555LJ:~$ echo $?
0
m@m-X555LJ:~$
Run Code Online (Sandbox Code Playgroud)
嗯 因此,我的第一个假设被反驳。我认为这是Haskell程序将退出状态返回到Shell的一种方式,就像C程序从其启动int main()
并使用return 0
或报告退出状态一样return 1
。
但是1
没有,上面的程序消耗了from输入的内容,然后什么也不做,特别是似乎没有将其返回1
给shell。
再测试一次:
m@m-X555LJ:~$ cat wtf.hs
main = getContents
m@m-X555LJ:~$ runhaskell wtf.hs
m@m-X555LJ:~$
Run Code Online (Sandbox Code Playgroud)
哇。这次,我尝试返回IO String
。由于我不知道的原因,这次Haskell 甚至 …
http://learnyouahaskell.com/functors-applicative-functors-and-monoids:
Product
定义如下:Run Code Online (Sandbox Code Playgroud)newtype Product a = Product { getProduct :: a } deriving (Eq, Ord, Read, Show, Bounded)
为什么Product
被迫成为Bounded
?
在同一本书中,以下几段内容:
它的实例
Monoid
有点像这样:Run Code Online (Sandbox Code Playgroud)instance Num a => Monoid (Product a) where mempty = Product 1 Product x `mappend` Product y = Product (x * y)
嗯 唯一的约束是Num a
!但是Num
,尤其是Integer
,这不是Int
AFAIK的限制(不同于)。
然后让我们对其进行测试:
import Data.Monoid
numbers :: [Integer]
numbers = [1..100]
main = print (getProduct . mconcat . map Product …
Run Code Online (Sandbox Code Playgroud)